通过添加它们的值来合并两个JSON

时间:2018-06-01 16:53:06

标签: php merge

我正在尝试合并两个JSON,但是如果找到它的话,我不想覆盖它的值,如果找到它,我想添加该值。例如,假设我有三个值。

$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 :(得分:0)

这是一个开始,我无法完成,因为我必须离开。祝你好运!

<?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 "</pre>";

答案 1 :(得分:-1)

您可以使用以下命令将任何JSON字符串转换为数组:

Preconditions

如果您希望每个JSON字符串最终作为数组的单独元素,您可以使用:

$result = json_decode($jsonString,true) ;

因此,在您的情况下,您可以使用:

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

虽然我会推荐一个循环,以防你不总是有三个(例如$ a,$ b&amp; $ c)。

您应该始终在每个json_decode()之后检查json_last_error(),以确保您没有生成错误。

答案 2 :(得分:-1)

由于JSON是序列化数据,您需要解析需要合并的两个json对象,然后添加任何字段的结果,然后您可以更新其中一个原始json对象的值并序列化数据。

我之前没有使用过PHP,但是这篇文章是我在PHP中解析json对象时发现的。 http://php.net/manual/en/function.json-decode.php

希望有所帮助。

答案 3 :(得分:-1)

1)相同的AC奖金不要叠加。这意味着你不能为一个单位添加两个天生盔甲。但是你可以做(​​基础+灵巧+自然+大小+护甲+盾牌)

2)为什么“触摸”和“平脚”布尔?您只需添加AC的不同子集

touch = base + dexterity + natural + size

平脚=基地+护甲+盾

3)如果你确实在谈论DnD,我希望你想为自己和你的朋友制作一个工具,因为你不能只为DnD发布一个工具,它是受版权保护的。