【问题标题】:How can I merge two arrays recursively for only keys in the first array如何仅针对第一个数组中的键递归合并两个数组
【发布时间】:2014-03-27 14:19:06
【问题描述】:

我正在尝试递归合并两个数组,同时遵循一些简单的规则: 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;
            }
        }
    }

但它似乎不起作用,数组似乎不受影响。我做错了什么?

【问题讨论】:

    标签: php arrays recursion


    【解决方案1】:

    您可以尝试以下方法:

    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 也没有& 引用。

    【讨论】:

    • 这部分可行,但仍然需要将array1中第二个数组未设置的元素设置为0,这样,它们仍然是空的。
    • @user279988 如果你觉得我的回答有帮助,记得用左边的粗体接受它。
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多