array_replace仅替换顶层键值,子数组被整体覆盖;array_replace_recursive则递归合并各层,保留未冲突字段并更新同名键值。

array_replace 只替换第一层,不深入子数组
它把整个子数组当做一个“值”来处理。如果第一个数组某个键对应的值是数组,而第二个数组同名键也是数组,不会逐个合并子项,而是直接用第二个数组的整个子数组覆盖第一个数组的子数组。
- 遇到键名相同且值都是数组时:原数组的子数组被整体替换,内部结构完全丢弃
- 遇到键名相同但类型不同时(比如原为字符串,新为数组):新值直接覆盖,不报错也不递归
- 新增键名:照常添加到顶层,不影响已有结构
array_replace_recursive 会逐层穿透,递归覆盖每一级
它真正“钻进去”处理嵌套结构:只要某一层的两个对应键名相同,且它们的值又都是数组,就继续进入下一层重复这个逻辑;直到某一层的值不再是数组,才执行最终覆盖。
- 子数组中同名键的标量值(如字符串、数字)会被新值替换,老值保留
- 子数组中只在新数组里出现的键,会被添加进来;只在原数组里的键则保留
- 多层嵌套(如三级、四级)也适用,逻辑一致,无需额外代码
一个对比示例很能说明问题
假设:
$base = ['user' => ['name' => 'A', 'age' => 20], 'status' => 'active'];
$patch = ['user' => ['age' => 25, 'city' => 'Beijing'], 'status' => 'pending'];
-
array_replace($base, $patch) → user 子数组被整个替换成
['age' => 25, 'city' => 'Beijing'],name丢失 -
array_replace_recursive($base, $patch) → user 子数组变成
['name' => 'A', 'age' => 25, 'city' => 'Beijing'],旧字段保留,新字段加入,冲突字段更新
选择依据看你的数据结构需求
如果只是想“换掉某个配置块”,用 array_replace 更干脆;
如果希望“精准更新部分字段,同时保留其余配置”,array_replace_recursive 是标准解法。
尤其适合配置合并、API响应补全、表单默认值注入等场景。











