首页 > 解决方案 > PHP - 合并附加多个json数组

问题描述

我需要合并/加入多个包含数组的 json 字符串(也需要合并),但我不知道实现此目的的最佳方法是什么:

json 字符串的初始数组(在下面的示例中称为 $rrDatas):

Array
(
    [0] => {"asset":[1],"person":[1]}
    [1] => {"asset":[2]}
)

预期结果 :

{"asset":[1,2],"person":[1]}

主要的困难是数组的数量是不确定的(我的例子是用 2 个数组但它可能是 3,4 等)。第二个困难是可以有多个属性(如“资产”、“人”等,但总是数组)。这些可能的属性是已知的,但很多,所以如果算法是动态的会更好。

我现在能做的:

$mergedAssets['asset'] = [];
foreach ($rrDatas as $rrData)
{
     $rrDataJson = \GuzzleHttp\json_decode($rrData, true);
     $mergedAssets['asset'] = array_merge($mergedAssets['asset'],$rrDataJson['asset']);
}
$result = \GuzzleHttp\json_encode($mergedAssets, true);

结果 :

{"asset":[1,2]}

这很好用,但这不是动态的,我应该为每个可能的属性(即“人”等)复制这部分吗?

谢谢,纪尧姆

编辑:Brett Gregson 和 krylov123 在下面的回答帮助我建立了自己的解决方案,这是两种建议的混合:

$mergedJson = [];
foreach ($rrDatas as $rrData)
{
     $rrDataJson = \GuzzleHttp\json_decode($rrData, true);
     foreach(array_keys($rrDataJson) as $property)
     {
          $mergedJson[$property] = array_merge($mergedJson[$property] ?? [], $rrDataJson[$property]);
     }
}
return \GuzzleHttp\json_encode($mergedJson, true);

在下面找到一个更好的例子:

$rrDatas = Array ( 
     [0] => {"asset":[1,2],"person":[1],"passive":[1]} 
     [1] => {"asset":[3],"charge":[1],"passive":[2]} 
) 

这必须导致:

{"asset":[1,2,3],"person":[1],"passive":[1,2],"charge":[1]}

编辑 2:我刚刚尝试过 Progrock 的解决方案,它似乎也能完美运行:https ://3v4l.org/7hSqi

标签: phparraysjsonmerge

解决方案


你可以使用类似的东西:

$output = []; // Prepare empty output

foreach($rrDatas as $inner){
  foreach($inner as $key => $value){
    $output[$key][] = $value;
  }
}

echo json_encode($output); // {"asset":[1,2],"person":[1]}

这应该会给你想要的输出。无论单个数组中的键如何,即使是空数组,这都应该有效。

这里的工作示例

另一个包含更多数组、更多键和空数组的示例


推荐阅读