一、array_sum是什么
array_sum()是PHP的内置数组函数,用来把数组里所有“值”加起来,返回一个整数或浮点数。它从PHP4.0.4开始提供,属于使用频率很高、但细节容易被忽略的一类函数。
语法:
array_sum(array $array): int|float
参数只有一个,且必填:要计算的数组。返回值是数组中所有值的总和。
这里有一个关键点:array_sum()只关心数组的“值”,不关心键名。无论数组是索引数组、关联数组,还是混合键名,它都会把所有值逐个相加。
二、基础用法与代码号学习编程示例
示例1:整数数组求和
<?php
$numbers = [13, 26, 39, 52];
echo array_sum($numbers);
输出:
130
这是最直接的场景。数组中的每个元素都是整数,结果也是整数。
示例2:空数组的处理
<?php
$empty = [];
var_dump(array_sum($empty));
输出:
int(0)
空数组不会报错,也不会返回null,而是返回整数0。这一点在项目里很实用:统计前不需要额外判断数组是否为空,直接调用即可。
示例3:关联数组与浮点数
<?php
$prices = [
"apple" => 13.2,
"banana" => 25.7,
"orange" => 0.8
];
echo array_sum($prices);
输出:
39.7
键名apple、banana、orange不参与计算,只有值被相加。
示例4:混合浮点数的求和
<?php
$amounts = [
"a" => 1.42,
"b" => 70.3,
"c" => 50.4
];
echo array_sum($amounts);
输出:
122.12
三、类型转换规则:为什么结果有时是int,有时是float
array_sum()的返回值类型并不是固定的,它遵循PHP的算术运算规则:
-
数组中所有值都是整数,结果是整数;
-
数组中只要有一个值是浮点数,结果就是浮点数;
-
字符串数字会被转换为数字参与计算;
-
布尔值
true转为1,false转为0; -
null转为0; -
非数字字符串(如
"abc")在PHP8中会抛出TypeError,在PHP7及更早版本中会被当作0。
看一个容易踩坑的例子:
<?php
$data = [1, 2, "3", true, null];
var_dump(array_sum($data));
输出:
int(6)
计算过程是:1+2+3+1+0=7?不对,实际结果是6?这里需要说明:"3"被转为3,true转为1,null转为0,所以总和是1+2+3+1+0=7。但实际输出是int(7)。我写6是错的,正确结果是7。这也说明:不要凭记忆判断类型转换,遇到混合类型时直接用var_dump()验证。
在PHP8中,如果数组中包含无法转换为数字的字符串,例如:
<?php
$data = [1, 2, "abc"];
var_dump(array_sum($data));
会抛出:
TypeError: Unsupported operand types: int + string
所以,生产环境中如果数组来源不可控,建议先做数据清洗,或者用array_filter()过滤掉非数字值。
四、项目实战中的经验与反思
1.购物车金额统计
早期做电商项目时,购物车金额统计常写成循环累加:
$total = 0;
foreach ($cart as $item) {
$total += $item['price'] * $item['qty'];
}
后来发现,如果只需要对“已经计算好的小计数组”求和,直接用array_sum()更简洁:
$subtotals = array_map(fn($item) => $item['price'] * $item['qty'], $cart);
$total = array_sum($subtotals);
但要注意:array_sum()不负责乘数量,它只做加法。乘数量这一步必须先用array_map()或循环完成。这是很多人第一次用时会误解的地方。
2.浮点数精度问题
array_sum()返回浮点数时,仍然受IEEE754浮点精度影响。比如:
<?php
$nums = [0.1, 0.2];
var_dump(array_sum($nums));
输出:
float(0.30000000000000004)
这不是array_sum()的bug,而是浮点数本身的表示问题。涉及金额时,我的建议是:不要用浮点数做最终结算。可以把金额以“分”为单位存成整数,求和后再除以100展示;或者使用bcadd()做高精度计算。
3.二维数组不能直接求和
array_sum()只对一维数组有效。如果数组元素本身还是数组,它无法自动递归求和:
<?php
$data = [[1, 2], [3, 4]];
var_dump(array_sum($data));
输出:
int(0)
原因是数组与整数相加时,数组会被转为0(PHP7)或抛出错误(PHP8)。正确做法是先扁平化:
<?php
$data = [[1, 2], [3, 4]];
$flat = array_merge(...$data);
var_dump(array_sum($flat)); // int(10)
4.与array_product的区分
array_sum()是求和,array_product()是求积。两者参数结构一致,但用途不同。项目中如果要做“总价=单价×数量”的聚合,应该用array_product()处理单个商品的单价与数量,再用array_sum()汇总多个商品。不要混用。
五、本节课程知识要点
-
array_sum()只对数组的值求和,键名不参与计算。 -
空数组返回
0,不会报错。 -
返回类型取决于数组元素类型:全整数返回整数,含浮点数返回浮点数。
-
字符串数字会参与计算,非数字字符串在PHP8中会抛出
TypeError。 -
二维数组不能直接求和,需要先扁平化。
-
金额场景慎用浮点数求和,建议用整数分或高精度函数。
-
array_sum()不负责乘法,乘数量需另行处理。
六、常见问题
问:array_sum能用于对象数组吗?
不能直接用于对象。如果对象实现了__toString()或可转为数字,需要先映射为标量值。
问:array_sum和循环累加哪个快?
array_sum()是C层实现,通常比PHP层面的foreach更快,代码也更短。但如果是复杂计算,循环更灵活。
问:关联数组求和时键名会丢失吗?
键名本来就不参与计算,求和结果是一个标量,不存在“丢失键名”的问题。
问:array_sum能处理负数吗?
可以。负数会正常参与加法运算。
array_sum()是一个简单但容易用错的函数。它的核心规则只有一条:对数组的值做加法。真正需要留意的是类型转换、浮点精度、二维数组和空数组这几类边界情况。在项目里,把它用在“已经准备好的一维数值数组”上,配合array_map()、array_filter()做前置处理,能写出更干净、更稳定的统计代码。