array_sum是数值元素求和器,非数字转0(true为1),不递归、不校验类型,需预处理;空/非数组返回0,建议封装safe_array_sum并校验输入。

array_sum 只能处理数字,其他类型会被转成 0
它不是“加法计算器”,而是“数值元素求和器”。遇到 null、false、空字符串 ''、甚至字符串 'abc',都会被强制转为 0;只有 true 会变成 1。这容易让人误以为它“过滤了非数字”,其实只是 PHP 类型转换的副作用。
常见错误现象:
— 数组里混着 '1'(字符串)和 2(整数),结果正确但心里没底
— 有 ['a', 'b', 1, 2],结果是 3,而不是报错或跳过
- 如果要严格只加数字,得先用
array_filter($arr, 'is_numeric')预处理 - 注意浮点精度:
array_sum([0.1, 0.2])可能返回0.30000000000000004,别直接用==比较 - 嵌套数组不会递归展开 —
array_sum([[1,2], [3]])结果是0,因为外层数组元素是数组,不是数字
多维数组不能直接用 array_sum,得 flatten 或递归
PHP 的 array_sum 不支持深度遍历。传入二维数组,它只看第一层的值 — 而这些值是子数组,全被当 0 处理。
使用场景:从 API 拿到结构如 ['items' => [['price' => 10], ['price' => 20]]],想算总价
立即学习“PHP免费学习笔记(深入)”;
- 简单扁平化:用
array_merge(...$arr)前提是所有子数组都是一维且键可丢弃 - 提取字段再求和:用
array_column($arr, 'price')+array_sum() - 真递归求和(含任意嵌套):必须手写递归函数或用
array_walk_recursive收集数字
空数组或非数组输入返回 0,不报错但可能掩盖问题
array_sum(null)、array_sum('not array')、array_sum([]) 全都返回 0。看起来“很友好”,实则隐患大 — 尤其在数据来源不确定时(比如 JSON 解码失败返回 null)。
错误现象:
— 接口返回空或格式错误,代码却默默算出 0,账对不上
— 函数参数没校验,传进字符串反而“成功”执行
- 调用前建议加判断:
is_array($data) && !empty($data) - 更稳妥的做法:封装一层,比如
safe_array_sum($arr),对非数组抛InvalidArgumentException - 注意:PHP 8.0+ 对
array_sum的参数类型声明仍是array,但运行时不强制,所以类型检查得自己做
性能上没坑,但大数据量时别反复调用
array_sum 是 C 实现,O(n) 时间,非常快。真正容易拖慢的是滥用 — 比如在循环里对同一数组反复调用,或者在 foreach 中每次取子数组再 sum。
- 一次性算好存变量,别在条件分支里重复算同一组数据
- 如果要对多个字段分别求和(如 price、tax、fee),别写三次
array_sum(array_column(...)),用一次遍历完成 - 超大数组(十万级以上)且内存敏感时,考虑用生成器逐个 yield 数字再累加,避免中间数组开销
array_sum 再快也没用。










