array_replace_recursive 是 php 8.1 中用于多维数组深度合并的覆盖式更新函数,按层级递归替换同键值,保留不存在于右侧的左侧键,并支持数字键;与 array_merge_recursive 的“并存”逻辑相反,适用于配置补全。

array_replace_recursive 在 PHP 8.1 中仍是处理多维数组深度合并的核心函数,它不是简单叠加,而是按层级“覆盖式更新”——只替换存在且类型匹配的位置,其余结构原样保留。
覆盖规则:键存在才替换,逐层向下穿透
当两个数组在某一层有相同字符串键时,该键对应值才会进入下一轮判断:
- 若双方都是数组,继续递归比较子键,重复此规则
- 若左侧是数组、右侧不是(如字符串/数字),右侧值直接替换整个左侧子数组
- 若左侧不是数组、右侧是数组,右侧数组整体替换左侧原始值(不报错)
- 若键只存在于右侧数组,该键值会被新增到结果中
- 若键只存在于左侧数组,该键值完整保留,不受影响
和 array_merge_recursive 的关键区别
两者都递归,但目标相反:
-
array_merge_recursive:同键值“并存”,自动包裹成数组(如
['name' => ['Alice', 'Bob']]),适合收集数据 -
array_replace_recursive:同键值“替换”,右侧覆盖左侧(如
['name' => 'Bob']),适合配置补全或默认值覆盖
典型使用场景示例
比如合并默认配置与用户自定义配置:
默认配置:$defaults = ['db' => ['host' => 'localhost', 'port' => 3306], 'cache' => ['enabled' => true]];用户配置:
$user = ['db' => ['host' => '192.168.1.100'], 'log' => ['level' => 'debug']];执行:
$final = array_replace_recursive($defaults, $user);结果:
['db' => ['host' => '192.168.1.100', 'port' => 3306], 'cache' => ['enabled' => true], 'log' => ['level' => 'debug']]可见:db.host被覆盖,db.port保留,默认的 cache未被干扰,新增的 log 被加入。
注意事项
- 数字键(索引键)也被视为“键”,但行为与字符串键一致:右侧同索引值会替换左侧对应位置值
- 不能跳过某一层强行合并——必须路径连续,中间断层则整段替换
- PHP 8.1 已完全支持该函数,无兼容性问题;无需额外 polyfill
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











