array_reduce的核心作用是将数组折叠为单一值,通过回调函数累积计算,不修改原数组;它从左到右遍历,以初始值或首元素为起点,依次合并当前项与累积值。

array_reduce 的核心作用是把数组“压缩”成一个单一值,靠的是你提供的回调函数一次次累积计算——它不改变原数组,只返回最终结果。
工作原理:从左到右逐个“折叠”
array_reduce 按顺序遍历数组,每次把“上一次的结果”和“当前元素”传给回调函数,再用返回值作为下一轮的“上一次结果”。第一次调用时,若未指定初始值,就用第一个元素当“上一次结果”,从第二个元素开始处理。
- 空数组且没给初始值 → 返回 null
- 空数组但给了初始值 → 直接返回该初始值
- 单元素数组且没给初始值 → 不进回调,直接返回该元素
- 回调函数必须接收两个参数:$carry(累积值)和 $item(当前项)
常见用途与写法示例
求和、拼接、找最大值、统计频次……这些都可以用 array_reduce 实现,关键是设计好累积逻辑。
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。
-
// 求和
$sum = array_reduce([1,2,3,4], function($carry, $item) { return $carry + $item; }); // 10 -
// 字符串拼接(加分隔符)
$str = array_reduce(['a','b','c'], function($carry, $item) { return $carry === '' ? $item : $carry . '-' . $item; }, ''); // "a-b-c" -
// 统计单词出现次数
$words = ['apple', 'banana', 'apple', 'cherry'];
$count = array_reduce($words, function($carry, $word) {
$carry[$word] = ($carry[$word] ?? 0) + 1;
return $carry;
}, []); // ['apple'=>2, 'banana'=>1, 'cherry'=>1]
注意回调中的 $carry 初始化时机
初始值(第三个参数)不是可选的“锦上添花”,而是控制逻辑起点的关键。漏掉它,可能让代码在空数组或单元素时行为异常。
立即学习“PHP免费学习笔记(深入)”;
- 想确保总有数组返回?初始值设为 []
- 想确保总有数字?初始值设为 0(或 0.0)
- 字符串操作建议显式传 '',避免 null 参与拼接导致意外
- 复杂结构(如对象、嵌套数组)也应提供合理初始状态,否则 $carry 第一次可能是 null
对比 foreach:何时选 reduce?
不是所有聚合都要用 array_reduce。它适合逻辑清晰、纯函数式表达的场景;如果中间要 break、continue、做条件跳过,或者需多次修改同一变量,foreach 更直观可控。
- ✅ 适合:无副作用、每步只依赖前值和当前项、语义明确(如“把所有数加起来”)
- ❌ 少用:需要提前退出、依赖外部变量、步骤间有复杂分支判断
- ? 提示:写完 reduce 后读一遍回调,如果能自然说出“用上一个结果和当前项算出下一个结果”,那它就用对了









