【问题标题】:How to merge values of the second level of two arrays with different number of keys?如何合并具有不同键数的两个数组的第二级值?
【发布时间】:2014-07-03 14:48:25
【问题描述】:

我有以下数组:

$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个?

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

【问题讨论】:

    标签: php arrays


    【解决方案1】:

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

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

    检查fiddle

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

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

    【讨论】:

    • Uau!这是一个快速的答案,谢谢!这真的很优雅。由于两个数组的项目数始终相同,因此解决方案比我预期的要好。
    【解决方案2】:

    您可以遍历$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];
      }
    }
    

    【讨论】:

    • 它也有效,但我标记了另一个答案,因为它更适合两个数组的性质。谢谢!
    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 2019-12-28
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多