如何只为第一个数组中的键递归合并两个数组

时间:2014-03-27 14:19:06

标签: php arrays recursion

我正在尝试以递归方式合并两个数组,同时遵循一些简单的规则: 1)仅从第二个数组中获取第一个数组中存在的键,其值不是另一个数组。 2)第一个数组中第二个数组中没有匹配键的键应该设置为零。

数组1

Array
(
    [a_arr] => Array
    (
        [u1] => Array
        (
            [v] => 
            [a] => 
            [e] => 
            [d] => 
        )
        [u2] => Array
        (
            [v] => 
            [a] => 
            [e] => 
            [d] => 
        )
    )
    [b_arr] => Array
    (
    )
)

数组2:

Array
(
    [a_arr] => Array
    (
        [u1] => Array
        (
            [a] => 1
            [e] => 1
        )
        [u2] => Array
        (
            [v] => 1 
        )
        [u3] => Array
        (
            [e] => 1 
        )
    )
    [b_arr] => Array
    (
    )
)

合并后的预期输出数组:

Array
(
    [a_arr] => Array
    (
        [u1] => Array
        (
            [v] => 0
            [a] => 1
            [e] => 1
            [d] => 0
        )
        [u2] => Array
        (
            [v] => 1
            [a] => 0
            [e] => 0
            [d] => 0
        )
    )
    [b_arr] => Array
    (
    )
)

我写的这个函数是:

private function mergeArrayRecursive(&$arr1,&$arr2){
        foreach($arr1 AS $k=>$v){
            if(is_array($v)){
                if(isset($arr2[$k])){
                    $this->mergeArrayRecursive($v,$arr2[$k]);
                }
            }
            else if(isset($arr2[$k])){
                $arr1[$k] = $arr2[$k];
            }
            else{
                $arr1[$k] = 0;
            }
        }
    }

但它似乎不起作用,阵列似乎仍未受影响。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用以下方法:

private function mergeArrayRecursive($arr1, $arr2){
    foreach ($arr1 as $k => $v) {
        if (is_array($v) && isset($arr2[$k])) {
            $arr1[$k] = $this->mergeArrayRecursive($v, $arr2[$k]);
        } else if (isset($arr2[$k])) {
            $arr1[$k] = $arr2[$k];
        }
    }
    return $arr1;
}

改变了什么?没有最后else声明,您忘记了return。 params也没有&参考。