【问题标题】:Combine two multidimensional arrays合并两个多维数组
【发布时间】:2011-10-11 19:21:48
【问题描述】:

我有两个多维数组,例如:

[a]
  [b]
    [c]             

[a]
  [b]
    [c]
    [d]

想把它变成一个数组

[a]
  [b]
    [c]
    [d]

我尝试了array_merge_recursive() 函数,但它在最后一层创建新元素而不是覆盖它们。

例如,如果[c] 在第一个数组中是"X",在第二个数组中是"Y",我会得到array("X", "Y") 而不是最后一个值 ("Y")。

【问题讨论】:

  • 这似乎是默认行为。您可能需要使用 array_walk_recursive() 或其他一些 UDF 编写自己的代码来执行您描述的逻辑。
  • 我有一个疑问,如果第二个数组包含 [p] [q] [c][d] 这种类型的数据呢?预期的输出是什么?
  • 请向我们展示您的代码以及实际的输入和输出。

标签: php arrays


【解决方案1】:

这就是你所追求的吗,使用array_replace_recursive

<?php

$arr1 = array ('a' => array ('b' => array ('c' => 'X'), 'd' => 'array_1_d'));
$arr2 = array ('a' => array ('b' => array ('c' => 'Y', 'd' => 'Z')), 'e' => 'array_2_e');

$arr3 = array_replace_recursive ($arr1, $arr2);

var_dump($arr3);

输出:

array(2) {
  ["a"]=>
  array(2) {
    ["b"]=>
    array(2) {
      ["c"]=>
      string(1) "Y"
      ["d"]=>
      string(1) "Z"
    }
    ["d"]=>
    string(9) "array_1_d"
  }
  ["e"]=>
  string(9) "array_2_e"
}

http://www.php.net/manual/en/function.array-replace-recursive.php

【讨论】:

  • 我认为这是一个与迭代器对象同时引入的新功能......我也忽略了它:)
  • @CD001;从 PHP 5.3 开始,迭代器早在此之前就存在了。
【解决方案2】:

考虑两个数组:

<?php 
$test1 = array(array('a','b','c'), 'a', 'b'); 
$test2 = array(array('d','e'), 'c'); 
?> 

在使用覆盖合并时,您希望结果是一个数组:

<?php $test3 = array(array('d','e'), 'c', 'b'); ?> 

然而,大多数函数都会产生这个数组:

所以,这里有一个函数可以做到这一点:

<?php 
function array_merge_overwrite(array &$array1, array $array2 = NULL) 
{ 
    $flag = true; 
    foreach (array_keys($array2) as $key) 
    { 
        if (isset($array2[$key]) && is_array($array2[$key])) 
        { 
            if (isset($array1[$key]) && is_array($array1[$key])) 
                array_merge_overwrite($array1[$key], $array2[$key]); 
            else 
                $array1[$key] = $array2[$key]; 

            $flag = false; 
        } 
    } 

    if ($flag == true) 
        $array1 = $array2; 
} 
?>

【讨论】:

  • 如果您将一个空数组作为$array2 传递,该函数将返回一个空数组吗?
【解决方案3】:

编辑: Just seeing,为此存在一个函数:):array_replace_recursiveDocs。如果低于 PHP 5.3,这可能仍然有用:

Union of two arrays(带字符串键),递归:

function array_union_recursive(Array $a, Array $b)
{
    foreach($a as $k => &$v)
    {
        if (is_array($v) && isset($b[$k]) && is_array($b[$k]))
        {
            $v = array_union_recursive($a[$k], $b[$k]);
        }
    }

    $a += $b;
    return $a;
}

如果你想得到最后一个值而不是第一个值,你需要在调用函数时交换$a$b,但无论如何你需要以某种方式指定规则。这就是array_merge_recursive 保存每个值的原因。

Demo

【讨论】:

  • 感谢这项工作!但我会选择Daren的array_replace_recursive,因为它是内置的:D
  • @Alex,当然,我不知道,否则我会建议它;)
猜你喜欢
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多