【问题标题】:Functions like array_merge with recursive processing具有递归处理的 array_merge 等函数
【发布时间】:2022-08-17 23:07:28
【问题描述】:

我有两个这样的数组。

$array_1 = array(
    \'array_key\' => array(
        \'array_key_1\' => 1,
        \'array_key_2\' => 2,
        \'array_key_3\' => 3,
    ),
);

$array_2 = array(
    \'array_key\' => array(
        \'array_key_1\' => null,
        \'array_key_2\' => null,
        \'array_key_3\' => null,
        \'array_key_4\' => null,
        \'array_key_5\' => null,
    ),
);

我想创建一个函数来从这些数组中创建一个新数组,并辅以一个键不存在的数组。

$array_true = array(
    \'array_key\' => array(
        \'array_key_1\' => 1,
        \'array_key_2\' => 2,
        \'array_key_3\' => 3,
        \'array_key_4\' => null,
        \'array_key_5\' => null
    ),
);

我已经为 array_merge 创建了自己的函数,但它不支持递归,所以如果有更好的编写方法,我将不胜感激。


$array_1 = array(
    \'array_key\' => array(
        \'array_key_1\' => 1,
        \'array_key_2\' => 2,
        \'array_key_3\' => 3,
    ),
);

$array_2 = array(
    \'array_key\' => array(
        \'array_key_1\' => null,
        \'array_key_2\' => null,
        \'array_key_3\' => null,
        \'array_key_4\' => null,
        \'array_key_5\' => null,
    ),
);

// Ultimately, I would like to create such a function.
$array_true = array(
    \'array_key\' => array(
        \'array_key_1\' => 1,
        \'array_key_2\' => 2,
        \'array_key_3\' => 3,
        \'array_key_4\' => null,
        \'array_key_5\' => null
    ),
);

function my_merge_func($array_1,$array_2) {
    $merged =  array();
    foreach ($array_2 as $key => $value) {
        if (empty($array_1[ $key ])) {
            $merged[ $key ] = $value;
        } else {
            if (is_array($value)) {
              //  my_merge_func($array_1,$value);
                // I want to make it a recursive process since similar processing continues from here.
                foreach ($value as $key_1 => $value_1) {
                    if (empty($array_1[ $key ][ $key_1 ])) {
                        $merged[ $key ][ $key_1 ] = $value_1;
                    } else {
                        if (is_array($value_1)) {
                            foreach ($value_1 as $key_2 => $value_2) {
                                $merged[ $key ][ $key_1 ][ $key_2 ] = $value_2;
                            }
                        } else {
                            $merged[ $key ][ $key_1 ] = $array_1[ $key ][ $key_1 ];
                        }
                    }
                }
            } else {
                $merged[ $key ] = $array_1[ $key ];
            }
        }
    }
    return $merged;
};
var_dump(my_merge_func($array_1,$array_2));

var_dump($array_true);

var_dump(my_merge_func($array_1,$array_2) ===  $array_true);

    标签: php


    【解决方案1】:

    你可以这样做:

    function my_merge_func($array_1, $array_2) {
        $merged = $array_1; //EDITED: previously said $merged = array();
        foreach ($array_2 as $key => $value) {
            if (
                empty($array_1[ $key ])
                || !is_array($array_1[ $key ])
                || !is_array($value)
            ) {
                $merged[ $key ] = $value;
            } else {
                $merged[ $key ] = my_merge_func($array_1[ $key ], $value);
            }
        }
        return $merged; // EDITED: previously, return statement was missing.
    }
    

    需要考虑的一些事项:

    • 如果数组是递归的,这可能会产生无限循环:$a = []; $b = [&$a]; $a []= &$b; my_merge_func($a,$b); 会产生无限循环(我认为)。
    • 我做到了,对于$a = ['foo' => ['bar' => 'a']];$b = ['foo' => 'baz'],即使$a['foo'] 是一个数组,你也有my_merge_func($a,$b) = ['foo' => 'baz']

    【讨论】:

    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2015-02-20
    • 2018-10-11
    • 1970-01-01
    相关资源
    最近更新 更多