array_merge与+操作符本质不同:前者重排数字键并覆盖字符串键,后者保留原键且左优先;二者均不支持递归合并。

别直接用 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]被保留 - 若你依赖数字键做 UI 排序、分页偏移或 JSON 序列化结构,
+是唯一能守住原始键的方式
字符串键被意外覆盖?检查你用的是 array_merge 还是 +
配置数组、表单默认值、API 响应字段映射时,同名键是否该被右侧覆盖,决定了选哪个:
-
array_merge(['name' => 'Tom'], ['name' => 'Jerry'])→['name' => 'Jerry'](后写者胜) -
['name' => 'Tom'] + ['name' => 'Jerry']→['name' => 'Tom'](左优先,'Jerry'被忽略) - 常见坑:把用户提交的
$_POST和默认配置用array_merge合并,结果用户没填的字段被默认值覆盖了;反过来用+,用户填了的才生效,没填的才 fallback
混合键数组(数字+字符串)行为更隐蔽
像 [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_merge内部对两类键执行完全不同的规则
需要递归合并或深层覆盖?这两个都不行
array_merge 和 + 都是一层扁平合并,遇到嵌套数组会直接替换整个子数组,不会递归处理:
-
array_merge(['user' => ['name' => 'A']], ['user' => ['age' => 25]])→['user' => ['age' => 25]](整个'user'子数组被替换) - 真要合并嵌套结构,得用
array_replace_recursive,或者手动遍历 - 也别指望
+能“追加”子数组内容——它连一层都做不到“合并”,只是键存在就跳过
真正麻烦的不是语法记不住,而是调试时看到结果不对,却忘了自己在某个角落写了 array_merge,而那里其实该用 + 保默认值;或者相反,在需要覆盖配置的地方用了 +,导致新值进不去。键的语义(是序号?是标识?是可覆盖的配置?)必须先想清楚,再选操作符。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











