array_sum 返回 0 或 false 的主因是输入非数组(如 null、字符串)或含非数值元素;php 7+ 静默转空数组得 0,php 8.0+ 对非法类型抛 typeerror;它不支持嵌套数组,需先扁平化或递归提取数值;浮点精度丢失时应显式转换或用 bcmath。

array_sum 为什么返回 0 或 false?
常见现象是传入了非数组类型,比如 null、false、字符串或对象。PHP 7+ 会静默转成空数组(结果为 0),但 PHP 8.0+ 对 null 和非数组类型抛出 TypeError。别指望它自动展开嵌套数组——array_sum 只处理一维。
- 确认输入是数组:
is_array($data),不是isset($data[0])这类弱判断 - 避免直接传
json_decode($json)结果:默认返回对象,要加第二个参数true才得数组 - 空数组或全非数值元素(如
['a', 'b'])返回 0,不是报错——这是设计行为,不是 bug
多维数组怎么用 array_sum 算总和?
不能直接用。PHP 的 array_sum 不递归,遇到子数组就当 0 处理。比如 [[1,2], [3]] 会被算成 0 + 0 + 0 = 0。
- 简单扁平化:用
array_merge(...$arr)(PHP 5.6+),但仅限所有子数组都是数字索引且不关心键名 - 通用解法:写个递归函数或用
array_walk_recursive收集数值,再喂给array_sum - 注意性能:大数组慎用递归;如果结构固定(如二维),用两层
foreach累加比递归更稳
数值精度丢失或科学计数法干扰怎么办?
array_sum 内部用浮点运算,对超大整数(如 > 2^53)或小数连加容易丢精度。另外,若数组里混了字符串形式的数字(如 "1.23"),PHP 会自动转换,但 "1e2" 这种科学计数法字符串可能被转成 100,而你没意识到。
- 关键字段用
floatval()或(float)显式转换,比依赖隐式转换更可控 - 整数求和且值很大时,考虑用 BCMath:先
bcadd逐个累加,初始值设'0' - 检查源数据:数据库取出来的数字字段如果是
DECIMAL,PDO 默认可能返回字符串,别跳过类型校验
替代方案:什么时候不该用 array_sum?
当你要的不是“所有值相加”,而是带条件过滤、去重、或需中断逻辑时,硬套 array_sum 反而绕路。
立即学习“PHP免费学习笔记(深入)”;
- 含 null / false / 空字符串要跳过?用
array_filter($arr, 'is_numeric')预处理,再array_sum - 只加正数?别先
array_sum再减负数,直接array_reduce一行搞定:array_reduce($arr, function($carry, $item) { return $item > 0 ? $carry + $item : $carry; }, 0) - 需要同时统计个数和总和?一次遍历比两次
count+array_sum更快,尤其大数据量
真正麻烦的不是函数本身,是传进去的数据有没有被你认真看过类型和结构。










