【发布时间】:2020-02-29 23:58:14
【问题描述】:
我需要合并/加入多个包含数组的 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
【问题讨论】:
-
给定的示例具有固定的结构,因此其他人无法猜测您的上下文中什么是正确的。一般来说,这看起来是学习测试驱动开发的一个很好的练习
-
你怎么知道第一个
asset和第二个asset属于同一个人? -
也许我误解了你的问题,但你为什么要像你在你的例子中那样合并?我认为你应该再举一个例子。向我们展示您希望如何合并其他 JSON
-
每个属性数组都是独立的,并不意味着“资产”属于“人”。数组 $rrDatas 链接到一个用户,$rrDatas 的每个资产和人员都属于该用户,这就是它需要合并的原因。为了完成我的示例,对于用户测试,我可能有: $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]} Brett Gregson 和 krylov123 的回答帮助我构建了我的解决方案。请参阅上面的编辑。