加号运算符比array_merge()快,因其仅做键存在性判断和浅拷贝,无类型检查、重索引及函数调用开销;而array_merge()需参数校验、键类型判断、数字索引重排及内存管理,性能差距在高频调用时显著。

加号运算符(+)比 array_merge() 快,核心原因在于底层实现机制不同:前者是轻量级的“键存在性判断+浅拷贝”,后者是功能完整但开销更高的“遍历+类型判断+逻辑分支+重索引”过程。
加号运算符只做一次扫描,不重排、不覆盖
它本质上等价于一个高效循环:
- 遍历右侧数组每个键值对
- 仅当该键在左侧数组中 不存在 时,才把该项加入结果
- 全程不修改左侧数组结构,不检查键类型(数字 or 字符串),不重置数字索引
- 没有函数调用开销,无参数校验,无错误警告逻辑
array_merge() 要处理多种情况,每步都耗资源
它必须为兼容各种输入做充分判断和转换:
- 逐个检查每个参数是否为数组,非数组会触发警告(需错误处理路径)
- 对每个元素判断键类型:字符串键直接赋值,数字键一律追加到末尾并重新编号
- 若输入含纯数字索引数组,还要执行连续整数重索引(如
[2,3] + [4,5]→ 键从 0 开始重排) - 内部需分配新哈希表、管理引用计数、处理内存拷贝
性能差距在大量重复调用时特别明显
实测循环 10 万次合并两个小数组:
-
$a + $b通常耗时接近 0 秒(实际多为毫秒级) -
array_merge($a, $b)可能达 5–6 秒(取决于 PHP 版本与环境) - 差距主要来自函数调用本身、参数解析、类型检查和索引重建的累积成本
但快不等于适合所有场景
选择不能只看速度,要看语义是否匹配需求:
- 需要保留左侧配置、跳过右侧重复键 → 用
+ - 需要拼接索引数组、让数字键连续增长 → 必须用
array_merge() - 需要后值覆盖同名关联键 → 用
array_merge()或array_replace() - 传入可能为
null:加号能静默转为空数组,array_merge()会报 Warning
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











