首页 > 解决方案 > 如何使用唯一键递归合并数组?

问题描述

我像这样创建我的数组:

foreach ($array as $key => $value) {
          $array1[$value->getUuid()][$value->getFields()->getName()] = $value->getContent();
        }

结果是array1:

array:2 [▼
  "d8ab80f4f6" => array:16 [▶]
  9087785727 => array:16 [▶]
]

我以稍微不同的方式创建另一个数组,array2:

array:2 [▼
  "d8ab80f4f6" => array:3 [▶]
  9087785727 => array:3 [▶]
]

现在我想合并这些数组:

$output = array_merge_recursive($array1,$array2);

输出是:

array:3 [▼
  "d8ab80f4f6" => array:19 [▶]
  0 => array:3 [▶]
  1 => array:16 [▶]
]

但我希望输出是:

array:3 [▼
  "d8ab80f4f6" => array:19 [▶]
  "9087785727" => array:19 [▶]
]

标签: phparraysmergeassociative-array

解决方案


array_merge并将array_merge_recursive字符串键与数字键区别对待:

如果输入数组具有相同的字符串键,则将这些键的值合并到一个数组中,这是递归完成的,因此如果其中一个值是数组本身,则该函数会将其与相应的条目合并在另一个数组中。但是,如果数组具有相同的数字键,则后面的值不会覆盖原始值,而是会被追加。

这就是这里发生的事情。键9087785727是数字,因此这些条目不会被合并。

所以你需要编写自己的循环。

$output = [];
foreach ($array1 as $key => $value) {
    $output[$key] = array_merge($value, $array2[$key]);
}

演示


推荐阅读