【问题标题】:Merging two JSON by adding their value通过添加它们的值来合并两个 JSON
【发布时间】:2018-06-01 16:53:05
【问题描述】:

我正在尝试合并两个 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

【问题讨论】:

  • 您是否有想要求和的特定键(如natural_armor)或每个数字字段?
  • 这可能是一个非常复杂的程序,因为 json 数组的数量是可变的。我们需要比较 json 的所有键并确保它们具有相同的名称。我们还需要知道所有键的布尔值是否相同(真值或假值),最后将数值相加。我给了你一个开始(检查我的答案)无法完成它,因为我必须离开。

标签: php merge


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以使用以下方法将任何 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_decode() 之后检查 json_last_error() 以确保您没有产生错误。

    【讨论】:

      【解决方案3】:

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

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

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

        1) 相同的 AC 奖励不会叠加。这意味着你不能为一个单位添加两件天生护甲。但是你可以做到(基础 + 敏捷 + 自然 + 体型 + 护甲 + 盾牌)

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

        触感 = 基础 + 灵巧 + 自然 + 尺寸

        扁平足 = 基础 + 盔甲 + 盾

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

        【讨论】:

        • 它是用于探路者,而不是 DnD,它是将模板应用于现有生物。因此,这些模板的准确措辞是“将生物的天生护甲提高 X”,而不是“生物获得 X 的天生护甲”。此外,由于在探路者中有大约 10 种类型的子 AC(自然、偏转、闪避、魔法、增强、盔甲、盾牌……),其中一些适用于触摸和/或扁平足,还有一些生物有特定的能力说“这个生物的天生盔甲也适用于接触”,我试图尽可能地包容。
        • 无论如何,如果您真的希望看到有帮助的答案,您需要提供更多关于您的输入案例的信息。比如,每个数组代表什么?是基本统计数据之一,其余的则添加到其中吗?您会同时出现许多基本数组和加法数组吗?具有布尔值的相同字段是否总是具有相同的值?如果他们不这样做会发生什么,你如何结合布尔值?另外我相信,如果你想要一个探路者工具却无法解决这个问题,你将无法成功创建该工具。
        • 好吧,我设法说服我的老师把它作为我的年度学校项目。所以我真的没有选择成功。我唯一的遗憾是我应该更多地考虑我存储这些数据的方式。在考虑使用我的数据库关系存储之前,我太早问了我的老师,他说我可以尝试将它存储在 JSON 中。这让我自己更难了。感谢您的提醒,下次我提出问题时,我会尽量记住这一点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-22
        • 2011-12-20
        • 2020-11-12
        • 1970-01-01
        相关资源
        最近更新 更多