You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现支持递归处理的类array_merge函数的技术咨询

递归合并PHP数组,补充缺失键的实现方案

需求说明

我有两个PHP数组:

$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_2为模板补充array_1中不存在的键,同时保留array_1已有的值,最终目标数组如下:

$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_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
    ),
);

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)) {
              // 此处希望改成递归处理,但未实现
                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);

优化的递归实现方案

以下是支持任意层级嵌套的递归合并函数,完全匹配需求:

function recursive_merge($base_array, $template_array) {
    $merged = [];
    foreach ($template_array as $key => $value) {
        // 若双方当前键的值都是数组,则递归合并嵌套数组
        if (isset($base_array[$key]) && is_array($base_array[$key]) && is_array($value)) {
            $merged[$key] = recursive_merge($base_array[$key], $value);
        } else {
            // 优先保留base数组的值,缺失则用template数组的值补充
            $merged[$key] = isset($base_array[$key]) ? $base_array[$key] : $value;
        }
    }
    return $merged;
}

// 测试验证
$merged_result = recursive_merge($array_1, $array_2);
var_dump($merged_result === $array_true); // 输出 bool(true)

方案说明

  • 支持任意层级的嵌套数组,无需手动编写多层循环
  • 严格遵循需求逻辑:以array_2为模板补充键,保留array_1已有值
  • 代码逻辑简洁,扩展性强,可直接复用

内容的提问来源于stack exchange,提问作者simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:24:20