
array_merge 和 + 运算符根本不是一回事
它们连设计目标都不同:array_merge 是“合并后重排、后覆盖前”,+ 是“左侧优先、右侧仅补缺”。选错一个,轻则键被丢、值被吞,重则配置失效、接口返回错乱——尤其在处理默认配置 + 用户传参这种高频场景时。
字符串键冲突:覆盖 vs 保留
当数组含关联键(比如 ['host' => 'localhost', 'port' => 3306]),行为差异最明显:
-
array_merge($defaults, $user):若$user里也有'host',它会直接覆盖$defaults的值 -
$defaults + $user:只要$defaults已有'host',$user的同名键就彻底被忽略
所以给函数设默认参数,用 + 更安全;想让用户“强制覆盖”配置,才用 array_merge。
数字键(索引数组)表现完全相反
这是最容易翻车的地方。看这个例子:
立即学习“PHP免费学习笔记(深入)”;
$a = [10, 20];<br>$b = [30, 40];<br>var_dump($a + $b); // [0 => 10, 1 => 20]<br>var_dump(array_merge($a, $b)); // [0 => 10, 1 => 20, 2 => 30, 3 => 40]
原因:+ 把数字键当“已有键”处理,$b[0] 和 $b[1] 因为 $a 已存在同键而被丢弃;array_merge 则无视原键,把所有值顺序拼接并重编号。
- 要拼接两个列表(如日志条目、查询结果),必须用
array_merge - 想“用右边数组的某些字段补充左边”,但又怕数字键干扰逻辑,就别用
+——先用array_values()归一化再操作
NULL 或非数组传参时,错误静默 vs 显式报错
array_merge 很严格:传入 null 或字符串,立刻触发 Warning: array_merge(): Argument #2 is not an array;而 + 会尝试转换:null 变空数组,字符串变 [0 => 'xxx'],表面不报错,实则埋雷。
- 调试时发现数组突然多出奇怪的
0键?查查是不是误把字符串或null当数组用了+ - 写公共函数时,如果参数可能为空,宁可用
is_array($x) ? $x : []做兜底,也别依赖+的隐式转换
真正难的不是记规则,而是每次写 + 或 array_merge 前,得问自己一句:我到底想“继承默认”还是“允许覆盖”,想“拼长度”还是“保结构”。漏掉这一步,后面花三倍时间 debug 都不一定找得到根因。










