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 = GuzzleHttpjson_decode($rrData, true);
$mergedAssets['asset'] = array_merge($mergedAssets['asset'],$rrDataJson['asset']);
}
$result = GuzzleHttpjson_encode($mergedAssets, true);

结果:

{"asset":[1,2]}

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

谢谢,Guillaume

编辑:Brett Gregson和Krylof123的回答帮助我构建了自己的解决方案,这是两个建议的混合:

$mergedJson = [];
foreach ($rrDatas as $rrData)
{
$rrDataJson = GuzzleHttpjson_decode($rrData, true);
foreach(array_keys($rrDataJson) as $property)
{
$mergedJson[$property] = array_merge($mergedJson[$property] ?? [], $rrDataJson[$property]);
}
}
return GuzzleHttpjson_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

您可以使用以下内容

$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]}

这应该会给你想要的输出。无论单个数组中的键是什么,甚至对于空数组,这都应该起作用。

此处的工作示例

另一个例子有更多的数组和更多的密钥以及空数组

<?php    
$array =
[
'{"asset":[1],"person":[1]}',
'{"asset":[2]}',
];    
$array  = array_map(function($v) { return json_decode($v, true);}, $array);
$merged = array_merge_recursive(...$array);
print json_encode($merged);

输出:

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

您需要使用foreach ($array as $key => $value)迭代,才能动态使用json数组的键(例如"asset"one_answers"person"(。

解决方案:

$mergedAssets['asset'] = [];
foreach ($rrDatas as $key => $value)
{
$rrDataJson = GuzzleHttpjson_decode($value, true);
$mergedAssets[$key] = array_merge($mergedAssets[$key],$rrDataJson[$key]);
}
$result = GuzzleHttpjson_encode($mergedAssets, true);

最新更新