运算符左优先保留键值且不重索引数字键,array_merge() 右优先覆盖同名键并重排数字索引;前者支持两两结合、容错性强,后者支持多参数但要求全为数组,二者均为浅合并。

PHP 8.2 中 + 运算符和 array_merge() 都能合并数组,但底层逻辑完全不同——不是“谁更好”,而是“谁该在哪用”。关键差异集中在键的处理方式、数字索引行为、参数限制和容错性上。
字符串键:谁优先?
两者都按键名操作,但优先级相反:
-
+:左侧数组值永远保留,右侧同名键被直接忽略(左优先,不覆盖) -
array_merge():右侧数组值覆盖左侧同名键(右优先,覆盖式合并)
例如:$a = ['host' => 'localhost', 'port' => 80];$b = ['port' => 443, 'ssl' => true];$a + $b → ['host'=>'localhost', 'port'=>80, 'ssl'=>true]array_merge($a, $b) → ['host'=>'localhost', 'port'=>443, 'ssl'=>true]
数字键:是否重索引?
这是最易出错的点,尤其在 PHP 8.2 中行为完全一致于历史版本:
-
+:严格保留左侧数字键;右侧相同数字键(如0、1)被跳过,不重排、不追加 -
array_merge():丢弃所有原始数字键,将全部值按顺序重新从0开始连续编号
例如:$x = [10, 20];(即 [0=>10, 1=>20])$y = [30, 40];(即 [0=>30, 1=>40])$x + $y → [0=>10, 1=>20]($y 的元素全被忽略)array_merge($x, $y) → [0=>10, 1=>20, 2=>30, 3=>40]
参数与类型安全
PHP 8.2 加强了类型提示,但两者对非法输入的容忍度仍不同:
-
array_merge():要求每个参数必须是数组,传入null或字符串会触发E_WARNING并中止执行 -
+:自动将null转为空数组,其他标量转为单元素数组(如5 + ['a'=>1]等价于[0=>5] + ['a'=>1]),更宽松但可能掩盖逻辑错误
数量与嵌套支持
实际开发中需注意硬性限制:
-
+:仅支持两个操作数($a + $b + $c是合法语法,但等价于($a + $b) + $c,仍是两两左结合) -
array_merge():支持任意数量参数,如array_merge($a, $b, $c, $d) - 两者都只做**浅合并**:多维数组的子数组不会递归合并,同名子数组会被整体替换或丢弃,非深度需求勿误用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











