实现支持递归处理的类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
相关产品推荐
相关产品推荐

