array_merge与+操作符本质不同:前者重排数字键并覆盖字符串键,后者保留原键且左优先;二者均不支持递归合并。
别直接用或替换对方,它们根本不是同一类操作——一个重排+覆盖,一个保键+左优先。
数字索引数组合并后键名消失?用
保留原键
当你有
和
,想合并但不打乱已有顺序:
会强制重排为
(
被丢弃,
变成
)
得到
,但逻辑是:只加
中键不在
里的项 ——
被跳过,
被保留
若你依赖数字键做 UI 排序、分页偏移或 JSON 序列化结构,
是唯一能守住原始键的方式
字符串键被意外覆盖?检查你用的是
还是
配置数组、表单默认值、API 响应字段映射时,同名键是否该被右侧覆盖,决定了选哪个:
→
(后写者胜)
→
(左优先,
被忽略)
常见坑:把用户提交的
和默认配置用
合并,结果用户没填的字段被默认值覆盖了;反过来用
,用户填了的才生效,没填的才 fallback
混合键数组(数字+字符串)行为更隐蔽
像
这种数组,两种方式差异同时作用,容易误判:
立即学习
“
PHP免费学习笔记(深入)
”;
→
(数字键全重排,字符串键被覆盖)
→
(所有键都左优先,
和
全被跳过)
注意:
对数字键和字符串键一视同仁,不区分类型;而
内部对两类键执行完全不同的规则
需要递归合并或深层覆盖?这两个都不行
和
都是一层扁平合并,遇到嵌套数组会直接替换整个子数组,不会递归处理:
→
(整个
子数组被替换)
真要合并嵌套结构,得用
,或者手动遍历
也别指望
能“追加”子数组内容——它连一层都做不到“合并”,只是键存在就跳过
真正麻烦的不是语法记不住,而是调试时看到结果不对,却忘了自己在某个角落写了
,而那里其实该用
保默认值;或者相反,在需要覆盖配置的地方用了
,导致新值进不去。键的语义(是序号?是标识?是可覆盖的配置?)必须先想清楚,再选操作符。
array_merge++[0 => 'a', 1 => 'b'][0 => 'x', 2 => 'c']array_merge($a, $b)[0 => 'a', 1 => 'b', 2 => 'c']$b[0]$b[2]2$a + $b[0 => 'a', 1 => 'b', 2 => 'c']$b$a$b[0]$b[2]+array_merge+array_merge(['name' => 'Tom'], ['name' => 'Jerry'])['name' => 'Jerry']['name' => 'Tom'] + ['name' => 'Jerry']['name' => 'Tom']'Jerry'$_POSTarray_merge+[0 => 'x', 'id' => 1]array_merge([0 => 'x', 'id' => 1], [0 => 'y', 'id' => 2, 'name' => 'Lily'])[0 => 'x', 1 => 'y', 'id' => 2, 'name' => 'Lily'][0 => 'x', 'id' => 1] + [0 => 'y', 'id' => 2, 'name' => 'Lily'][0 => 'x', 'id' => 1, 'name' => 'Lily']$b[0]$b['id']+array_mergearray_merge+array_merge(['user' => ['name' => 'A']], ['user' => ['age' => 25]])['user' => ['age' => 25]]'user'array_replace_recursive+array_merge++