如何将两个数组的第二级数值与不同数量的键合并?

时间:2014-07-03 14:48:26

标签: php 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
               )
    )

我想合并两个数组,以便最终我有相同的结构,第一级的键数,但值将是#34;加入"在第二级,就像我们在下面的结果数组中看到的那样:

$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 个答案:

答案 0 :(得分:4)

有一个优雅的"解决问题的方法(但是,它需要两个数组必须具有相同的项目数):

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

检查fiddle

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

  

如果输入数组具有相同的字符串键,则为其值   这些键合并到一个数组中,这样就完成了   递归地,如果其中一个值是一个数组本身,那么   函数将它与另一个数组中的相应条目合并   太。但是,如果数组具有相同的数字键,则后者   值不会覆盖原始值,但会被追加。

答案 1 :(得分: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];
  }
}