我需要合并/连接多个包含数组的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);