array_reduce可用于合并数组但非最优,应以array_merge为回调并设空数组为初始值;需递归合并时改用array_replace_recursive;空输入或初始值错误易出错,简单场景推荐array_merge(...$arrays)。

用 array_reduce 合并多个数组是可行的,但要注意它**不是最直观或最高效的方式**——它更适合“累积计算”,而数组合并更常用 array_merge 或 splat(...)操作符。不过,若你明确想用 array_reduce(比如在函数式风格链式处理中),下面讲清楚怎么写才正确、安全。
核心写法:用 array_merge 作为回调
array_reduce 接收一个数组(这里是“多个数组组成的数组”)和一个回调函数。你需要把待合并的数组先装进一个二维数组里,再用 array_merge 累积合并:
$arrays = [
['a' => 1, 'b' => 2],
['b' => 3, 'c' => 4],
['c' => 5, 'd' => 6]
];
$result = array_reduce($arrays, 'array_merge', []);
// 结果:['a' => 1, 'b' => 3, 'c' => 5, 'd' => 6]
注意:array_merge 是覆盖式合并(后出现的键会覆盖前面的),且只支持一维索引/关联数组拼接。如果原数组含子数组,不会递归合并。
处理嵌套数组(递归合并)
若需深度合并(如 array_replace_recursive 的效果),不能直接用 array_merge,得自定义回调:
立即学习“PHP免费学习笔记(深入)”;
- 用
array_replace_recursive替代array_merge:
$result = array_reduce($arrays, 'array_replace_recursive', []);
- 或手动写逻辑,判断是否为数组再递归处理(适合有特殊规则时)。
常见陷阱与避坑建议
-
初始值必须是数组:第三个参数(initial value)不能省略或设为
null,否则第一次调用回调时会传入null和第一个子数组,导致警告或错误。 -
空输入要保护:如果
$arrays是空数组,array_reduce返回null(PHP 7.4+),所以带默认初始值更稳妥(如上例的[])。 -
性能不如直接 array_merge(...$arrays):PHP 5.6+ 支持展开运算符,一行就能搞定:
array_merge(...$arrays),更简洁、更快,也更易读。
什么时候真该用 array_reduce?
当你需要在合并过程中穿插其他逻辑时,例如:
- 只合并满足某条件的子数组(加
if判断); - 合并前对每个子数组做转换(如过滤键、映射值);
- 配合其他高阶函数组成 pipeline(如和
array_filter、array_map链式使用)。
纯合并需求,优先选 array_merge(...$arrays);强调函数式流程或需中间处理,array_reduce 才真正发挥作用。



















