PHP怎么计算数组平均值_PHP中array_sum配合count方法【说明】

2026-03-10编程代码217910

必须显式判断数组非空且元素为数值:先用 count($arr) === 0 检查空数组,再用 array_filter($arr, 'is_numeric') 或 array_reduce() 校验数值性,最后 (float)array_sum($arr) / count($arr) 计算平均值。

array_sum() 除以 count() 就是平均值,但得先处理空数组

直接用 array_sum($arr) / count($arr) 看似简单,实际一跑空数组就报 Division by zero 警告。PHP 不会自动跳过这个除零,哪怕你开了 error_reporting(0),它也可能在严格模式下触发致命错误。

常见错误现象:接口返回空白页、日志里突然冒出 Warning: Division by zero、数值计算结果变成 INFNaN

  • 必须显式判断 count($arr) === 0,不能只靠 empty() —— 因为 empty([0, 0])true,但数组非空且平均值应为 0
  • 如果业务允许,返回 null 或抛出异常比硬塞 0 更安全,避免下游误用
  • 注意浮点精度:[1, 2] 的平均值是 1.5,但若输入含字符串如 ['1', '2']array_sum() 会静默转数字,结果一样;可接受就别额外 array_map('floatval', $arr)

非数值元素会导致 array_sum() 计算失真

array_sum() 对非数字值不报错,而是按 PHP 类型转换规则处理:null0false0true1,字符串如 '1abc'1'abc'0。这很容易掩盖脏数据问题。

使用场景:从数据库查出的字段没强类型约束、API 接口传入未校验的混合数组、日志解析后拼装的指标数组。

立即学习“PHP免费学习笔记(深入)”;

wisecut

一款在线视频编辑软件,使用AI和语音识别为你编辑视频

下载

  • 如果要求严格,先过滤: array_filter($arr, 'is_numeric'),但注意 is_numeric('1e2') 返回 true,而 is_float('1e2')false
  • 更稳妥的做法是用 array_reduce() 手动累加并校验:遇到非数值直接 return false 或抛异常
  • 性能影响不大,但 array_filter() + array_sum() 比单次遍历多一次循环,大数据量时可合并逻辑

整数数组慎用 / 运算,优先 cast 为 float

PHP 中两个整数相除,结果可能是 float(如 5 / 2 → 2.5),但某些旧版本或 zend 引擎配置下行为不稳定;更麻烦的是,如果后续做比较(比如 == 2.5),隐式类型转换可能引发意外。

参数差异:intdiv() 是整除,完全不适用;bcdiv() 过重,除非要高精度小数位。

  • 统一强制转 float: (float) array_sum($arr) / count($arr),避免中间结果被当成整数截断
  • 如果需要固定小数位,用 round($avg, 2),但别在除法前 round —— 先算准再舍入
  • 注意 count() 返回 int,但除号右侧是 int 不影响结果类型,关键是左侧 array_sum() 返回 int/float 取决于输入,所以左侧 cast 最保险

关联数组、多维数组不能直接套用

array_sum() 只对一维索引数组“开箱即用”。遇到 ['a' => 1, 'b' => 2] 也能算,但这是靠它忽略键名、只取值;一旦是二维如 [[1,2], [3,4]]array_sum() 会把子数组当 0 处理(因为数组转 int 是 0),结果永远是 0

常见错误现象:调用后返回 0,查半天发现是结构没展平;或者用 json_decode($str, true) 后没检查是否真是一维。

  • 展平二维数组:用 array_merge(...$arr)(PHP 5.6+),但注意子数组键名冲突会覆盖
  • 递归求和(带深度控制):自己写个 array_walk_recursive() 收集数值,比 array_values() 套嵌套更可靠
  • 性能提示:array_merge(...$arr) 在数组很多时有内存压力,foreach 手动 push 更可控

实际写的时候,最常被忽略的是空数组防御和非数值元素的静默转换——这两点不加检查,线上跑几天才暴露,查起来还像偶发 bug。

本文地址:https://www.ufcn.cn/article/2234370.html

如非特殊说明,本站内容均来自于网友自主分享,概不代表本站观点,如有任何问题我们都将在收到反馈后的第一时间进行处理!