如何合并具有不同键数的两个数组的第二级值?

7

I have following arrays:

$array1 = "
    Array (
        [0] => Array (
                   [0] => Value1
                   [1] => Value2
               )

        [1] => Array (
                   [0] => Value3
                   [1] => Value4
               )

        [2] => Array (
                   [0] => Value5
                   [1] => Value6
               )
        ...
        [999] => Array (
                   [0] => Value7
                   [1] => Value8
               )
    )

并且

$array2 = "
    Array (
        [0] => Array (
                   [0] => ValA
                   [1] => ValB
                   [2] => ValC
                   [3] => ValD
               )

        [1] => Array (
                   [0] => ValE
                   [1] => ValF
                   [2] => ValG
                   [3] => ValH
               )

        [2] => Array (
                   [0] => ValI
                   [1] => ValJ
                   [2] => ValK
                   [3] => ValL
               )
        ...
        [999] => Array (
                   [0] => ValM
                   [1] => ValN
                   [2] => ValO
                   [3] => ValP
               )
    )

我希望将两个数组合并在一起,最终得到相同的结构和第一层级的键数,但第二层级的值会被“连接”在一起,就像我们可以在以下结果数组中看到的那样:

$array3 = "
    Array (
        [0] => Array (
                   [0] => Value1
                   [1] => Value2
                   [2] => ValA
                   [3] => ValB
                   [4] => ValC
                   [5] => ValD
               )

        [1] => Array (
                   [0] => Value3
                   [1] => Value4
                   [2] => ValE
                   [3] => ValF
                   [4] => ValG
                   [5] => ValH
               )

        [2] => Array (
                   [0] => Value5
                   [1] => Value6
                   [2] => ValI
                   [3] => ValJ
                   [4] => ValK
                   [5] => ValL
               )
        ...
        [999] => Array (
                   [0] => Value7
                   [1] => Value8
                   [2] => ValM
                   [3] => ValN
                   [4] => ValO
                   [5] => ValP
               )
    )

我尝试使用array_merge和array_merge_recursive,正如此解决方案所示:https://stackoverflow.com/a/16541831/3499881,但它没有起作用。
  • 我是否真的需要将所有数字键转换为字符串,或者可以通过这些键以某种方式完成?如果这是唯一的方法,您能否向我展示如何进行转换?

  • 还是问题是由于第一个数组中有2个键,在第二个数组中有4个键?

我会非常感激任何线索。非常感谢。

2个回答

4

有一种“优雅”的方法可以解决您的问题(但是需要注意,您的两个数组必须具有相同数量的项):

$result = array_map('array_merge', $array1, $array2);

请查看这个示例

回答您的问题:array_merge_recursive()会失败,因为它只是追加数字键,而不是合并它们:

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


哇!回答得好快,谢谢!这真的很优雅。由于两个数组始终具有相同数量的项目,因此解决方案比我预期的要好。 - Aloysia de Argenteuil

3
您可以循环遍历$array1,并在$array2中匹配键值后进行合并:
$array3 = array();
foreach ($array1 as $key => $a1) {
  if (array_key_exists($key, $array2)) {
    $array3[$key] = array_merge($a1, $array2[$key]);
  } else {
    $array3[$key] = $a1;
  }
}

上述方法的唯一限制是,如果 $array2 中存在键但 $array1 中不存在,它们不会被添加到数组中(在您的情况下不是问题)。另一种解决方案是收集两个数组中所有的键,然后循环执行合并操作:
$keys = array_unique(array_merge(array_keys($array1), array_keys($array2)));

foreach ($keys as $key) {
  if (array_key_exists($key, $array1) && array_key_exists($key, $array2)) {
    $array3[$key] = array_merge($array1[$key], $array2[$key]);
  } elseif (array_key_exists($key, $array1)) {
    $array3[$key] = $array1[$key];
  } else {
    $array3[$key] = $array2[$key];
  }
}

如果您合并两行(可能存在的)并将每行空值合并为一个空数组,则可以避免循环中的条件语句。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接