【问题标题】:PHP - Merge append multiple json arraysPHP - 合并附加多个json数组
【发布时间】: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 的回答帮助我构建了我的解决方案。请参阅上面的编辑。

标签: php arrays json merge


【解决方案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]}

【讨论】:

    【解决方案2】:

    你可以使用类似的东西:

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

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

    Working example here

    Another example 具有更多数组、更多键和空数组

    【讨论】:

      【解决方案3】:

      您需要使用 foreach ($array as $key =&gt; $value) 迭代,以便能够动态使用您的 json 数组的键(例如“资产”和“人”)。

      解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        • 2011-01-07
        • 2013-12-25
        • 1970-01-01
        相关资源
        最近更新 更多