我需要合并/加入包含数组的多个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]}
这很好用,但不是动态的,我应该为每个可能的属性(例如“ person”等)复制此部分吗?
谢谢,纪尧姆
编辑:下面布雷特·格雷格森(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