Слияние двух JSON путем добавления их стоимости - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь объединить два JSON, но вместо перезаписи значения, если оно найдено, я хочу добавить значение, если оно найдено. Например, если у меня есть tje, следующие три значения.

$a = "[{"base":"10","touch":true,"flatfooted":true}]"
$b = "[{"natural armor":"2","touch":false,"flatfooted":true}]"
$c = "[{"natural armor":"3","touch":false,"flatfooted":true}]"

Я бы хотел получить следующий результат:

"[{"base":"10","touch":true,"flatfooted":true},{"natural armor":"5","touch":false,"flatfooted":true}]"

Но я заблудился.

Спасибо за помощь.

Также,заранее спрашивая, чтобы не задавать другой вопрос: как я могу превратить каждый объект JSON в отдельный массив?

Предполагая, что в результате получится JSON, что-то вроде

$final[0]['base'] = 10,
$final[0]['touch'] = true,
$final[0]['flatfooted'] = true,
$final[1]['natural armor'] = 5,
$final[1]['touch'] = false,
$final[1]['flatfooted'] = true

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Вот начало, я не могу закончить, потому что я должен уйти.Удачи!

<code><?php

$a = '[{"base":"10","touch":true,"flatfooted":true}]';
$b = '[{"natural armor":"2","touch":false,"flatfooted":true}]';
$c = '[{"natural armor":"3","touch":false,"flatfooted":true}]';

//Decode values to arrays and get first item.
$a = json_decode($a, true)[0];
$b = json_decode($b, true)[0];
$c = json_decode($c, true)[0];

//Put them all in a array
$abc = [$a, $b, $c];


//Compare keys of all arrays, and put the ones with no diffs in a array
$noDiff = [];
foreach ($abc as $idx => $character) {
    //Skip first because we use it in the foreach
    for ($i = 1; $i < count($abc); $i++) {
        $diff = array_diff_key($character, $abc[$i]);
        if (empty($diff)) {
            $noDiff[] = $character;
            $noDiff[] = $abc[$i];
        }
    }

    //Remove item from $abc and reset index keys 
    array_splice($abc, $idx, 1);
}

//$noDiff will now contain array $b and $c and we know they both have the same keys.
//We need to be sure natural armor contains numeric values and that touch and flatfooted
//have both the same boolean value.
$merged = [];
$canCombine = true;
foreach ($noDiff[0] as $key => $value) {
    if (!is_numeric($value) || is_numeric($noDiff[1][$key]) {
        $canCombine = false;    
    } else {

    }
}


echo "<pre>";
var_dump(
    $noDiff
);
echo "
";
0 голосов
/ 01 июня 2018

Поскольку JSON является сериализованными данными, вам необходимо проанализировать два объекта json, которые необходимо объединить, затем добавить результат любых полей, после чего вы можете обновить значения одного из ваших исходных объектов json и сериализовать данные.

Раньше я не использовал PHP, но вот статья, которую я нашел по разбору объектов json в PHP.http://php.net/manual/en/function.json-decode.php

Надеюсь, это поможет.

0 голосов
/ 01 июня 2018

1) Те же бонусы AC НЕ складываются.Это означает, что вы не можете добавить два естественных доспеха для одного юнита.Вы можете, однако, сделать (базовый + ловкость + натуральный + размер + броня + щит)

2) Почему логические выражения "touch" и "плоскостопие"?Вы просто добавляете различные подмножества AC

касание = основание + ловкость + натуральный + размер

плоскостопие = основание + броня + щит

3) Если вы действительно говоритео DnD, я надеюсь, что вы хотите создать инструмент для себя и своих друзей, потому что вы не можете просто опубликовать инструмент для DnD, он защищен авторским правом.

0 голосов
/ 01 июня 2018

Вы можете превратить любую строку JSON в массив, используя:

$result = json_decode($jsonString,true) ;

Если вы хотите, чтобы каждая строка JSON заканчивалась как отдельный элемент массива, вы можете использовать:

$final[] = json_decode($jsonString,true) ;

Итак, в вашем случае вы можете использовать:

$final[] = json_decode($a,true) ;
$final[] = json_decode($b,true) ;
$final[] = json_decode($c,true) ;

Хотя я бы рекомендовал цикл, если у вас не всегда три (например, $ a, $ b & $ c).

Вы должны всегда проверять json_last_error () после каждого json_decode (), чтобы убедиться, что вы не генерировали ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...