array_replace 仅浅层替换,多维数组子项被整体覆盖;PHP 自带 array_replace_recursive 从5.3起支持深度合并,逐层递归处理关联键,数值索引则追加而非合并。

array_replace 在 PHP 7.3 中只做浅层替换,遇到多维数组时,子数组会被整个覆盖,而不是逐键递归合并。要实现真正的深度替换(即嵌套数组的键值逐层合并),需手动实现递归逻辑。
为什么 array_replace 无法深度替换
它只遍历第一层键,若某个键对应的是数组,就直接用新数组替换旧数组,不进入内部处理。例如:
$a = ['user' => ['name' => 'Alice', 'age' => 30]]; $b = ['user' => ['city' => 'Beijing']]; $result = array_replace($a, $b); // 结果:['user' => ['city' => 'Beijing']] —— 原来的 name/age 全丢失
手写递归 array_replace_recursive 替代方案
PHP 其实自带 array_replace_recursive 函数,从 PHP 5.3 起就已存在,完全支持多维数组的深度合并。它会逐层遍历,对同名键做递归处理:
- 如果两个值都是数组,继续递归合并
- 如果仅一个是数组,用该数组替换另一个值
- 否则以右侧数组的值覆盖左侧
$a = ['user' => ['name' => 'Alice', 'age' => 30]]; $b = ['user' => ['city' => 'Beijing']]; $result = array_replace_recursive($a, $b); // 结果:['user' => ['name' => 'Alice', 'age' => 30, 'city' => 'Beijing']]
自定义深度替换(需额外控制逻辑时)
若需更精细控制(如跳过 null 值、过滤空字符串、限制递归层级),可封装函数:
立即学习“PHP免费学习笔记(深入)”;
- 检查参数是否为数组,非数组直接返回右侧值
- 遍历左侧数组,对每个键:若右侧存在同名键且双方均为数组,则递归调用自身
- 否则直接赋右侧值(或按需加判断,如
!is_null($right[$k]))
注意事项
使用 array_replace_recursive 时注意:
- 数值索引会被重新编号(非合并,而是追加),它只对关联键递归;如需保留数字索引合并,需另行处理
- 若右侧数组某键值为
null,仍会覆盖左侧对应键(除非你自行加空值跳过逻辑) - 循环引用会导致无限递归,生产环境建议加递归深度限制



















