← array_splice()函数:PHP数组切片与替换的进阶用法 PHP uasort函数教程:用自定义比较函数按值排序数组并保留键名 →

PHP array_sum数组求和函数使用指南:从语法到项目实战

著
原创 2026-10-09 PHP 已有人查阅

一、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()做前置处理,能写出更干净、更稳定的统计代码。

← array_splice()函数:PHP数组切片与替换的进阶用法 PHP uasort函数教程:用自定义比较函数按值排序数组并保留键名 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号