多次循环调用array_merge性能差,应改用splat展开或foreach引用赋值;array_merge_recursive非优化方案,实际更慢。

array_merge 多次调用会显著拖慢性能
直接链式调用 array_merge($a, $b, $c, $d) 没问题,但若在循环里反复 array_merge($result, $next)(比如遍历 100+ 个大数组),性能会急剧下降。原因在于每次调用都创建新数组、复制全部元素、重索引数字键——时间复杂度接近 O(n²),且内存占用翻倍增长。
用 splat 运算符一次性展开所有数组(PHP 7.4+)
如果所有待合并数组已存在(非动态生成),优先用展开运算符传参,避免循环开销:
$allArrays = [$arr1, $arr2, $arr3, ..., $arrN]; $result = array_merge(...$allArrays);
- 底层直接解包为参数列表,仅一次 C 层合并操作
- 比循环调用
array_merge快 3–5 倍(实测百万级元素时) - 注意:
$allArrays本身不能过大(PHP 参数栈限制),一般不超过几千个子数组
用 foreach + 引用赋值替代多次 array_merge(兼容老版本)
当数组必须逐个处理(如从数据库或 API 流式获取),且无法预存全部数组时,放弃 array_merge,改用原地追加:
$result = [];
foreach ($arrays as $arr) {
foreach ($arr as $k => $v) {
$result[$k] = $v; // 字符串键覆盖,数字键自动追加
}
}
- 不重索引数字键(
array_merge会强制重排,这里保留原始顺序和键) - 内存恒定,无中间数组拷贝
- 若需严格保持
array_merge的数字键重排行为,可额外用array_values($result),但仅在最后执行一次
注意 array_merge_recursive 不是性能替代方案
别因为名字带 “recursive” 就以为它更快——它实际更慢。它对每个键做类型检查 + 递归分支判断,还可能把标量值转成数组,纯属功能差异,不是优化手段。真要深度合并,自己写轻量 deepMerge() 更可控。
真正影响性能的从来不是函数名,而是数据复制次数和键处理逻辑。批量展开或手动追加,选哪个取决于你是否能提前拿到全部数组;而一旦开始在循环里反复 array_merge,就已经踩进最典型的 PHP 数组性能陷阱了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











