跳转到主内容
极星编程网:以代码为星,赴技术山海!

PHP如何合并数组_array_merge与加号运算符区别【详解】

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]
这种数组,两种方式差异同时作用,容易误判: 立即学习 “ PHP免费学习笔记(深入) ”;
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
,而那里其实该用
+
保默认值;或者相反,在需要覆盖配置的地方用了
+
,导致新值进不去。键的语义(是序号?是标识?是可覆盖的配置?)必须先想清楚,再选操作符。

相关文章