PHP中array_merge和+区别是什么_PHP数组合并差异说明【解答】

5次阅读

PHP中array_merge和+区别是什么_PHP数组合并差异说明【解答】

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 都不一定找得到根因。

text=ZqhQzanResources