最稳方法是先检查数组非空,再用(float)array_sum($arr)/count($arr)计算平均值;需用is_numeric()预过滤非数字元素,大数据量时改用循环累加防内存溢出。

直接用 array_sum() 除以 count() 最稳
PHP 没有内置的「平均值函数」,array_avg() 不存在,别搜了。最可靠的做法就是手动算:总和除以元素个数。这方法兼容所有 PHP 版本(包括老到 5.6 的环境),不依赖扩展,也不触发警告。
常见错误是没处理空数组——count() 返回 0,直接除会报 Division by zero 警告甚至致命错误。
- 永远先判断
count($arr) > 0,再算除法 - 如果业务允许空数组返回
null或0,得显式写清楚,别靠默认行为 - 注意浮点精度:整数数组用
(float) array_sum($arr) / count($arr)强制转浮点,避免 PHP 7+ 中整数除法截断(比如[1,2]算出来是1而不是1.5)
示例:
$arr = [10, 20, 30];<br>if (count($arr) === 0) {<br> $avg = null;<br>} else {<br> $avg = (float) array_sum($arr) / count($arr); // → 20.0<br>}
遇到非数值元素?array_filter() + is_numeric() 先清理
真实业务里数组常混着字符串、null、布尔值,比如 API 返回的 ['score' => '85', 'bonus' => 'N/A']。直接扔给 array_sum() 会把非数字当 0 算,结果失真且不报错,极难排查。
立即学习“PHP免费学习笔记(深入)”;
别用 filter_var(..., FILTER_VALIDATE_FLOAT),它对科学计数法或带空格的字符串支持弱;is_numeric() 更宽松也更实用。
- 用
array_filter($arr, 'is_numeric')提取可转数字的值 - 过滤后务必再检查长度,避免清完只剩空数组
- 如果需要保留键名做后续映射,加第三个参数
ARRAY_FILTER_USE_BOTH,但多数场景不需要
示例:
$mixed = ['a', 10, '20.5', null, 30];<br>$nums = array_filter($mixed, 'is_numeric'); // → [1 => 10, 2 => '20.5', 4 => 30]<br>if (!empty($nums)) {<br> $avg = array_sum($nums) / count($nums); // → 20.166666...<br>}大数据量时别用 array_sum() —— 循环累加更省内存
当数组有几万甚至几十万个元素(比如日志统计、传感器批量读数),array_sum() 会一次性把整个数组加载进内存计算,可能触发 memory_limit 错误。而手写循环只维持一个累加变量,内存占用恒定。
性能上差异不大(PHP 底层 array_sum 是 C 实现),但内存水位是硬约束。
- 用
foreach遍历,边读边加,不生成新数组 - 初始化累加器为
0.0(而非0),避免整数溢出或隐式类型转换问题 - 仍需在循环外判断空数组,循环本身不解决这个问题
示例:
$huge_arr = range(1, 100000);<br>$sum = 0.0;<br>$count = count($huge_arr);<br>if ($count === 0) {<br> $avg = null;<br>} else {<br> foreach ($huge_arr as $val) {<br> $sum += (float) $val;<br> }<br> $avg = $sum / $count;<br>}
想一行写完?小心 ?? 和括号优先级
有人图省事写成 $avg = array_sum($arr) / ($count ?? 1),看着简洁,实际埋雷:如果 $count 是 0,?? 不生效(因为 0 是“存在但 falsy”,不是 null 或未定义),照样除零。
另一个坑是括号漏写:array_sum($arr) / count($arr) ?: 0 —— 这里 ?: 绑定的是整个除法结果,不是分母,逻辑完全不对。
- 必须写成
count($arr) ? array_sum($arr) / count($arr) : null - 或者更安全:先存
$count = count($arr),再三元判断,避免重复调用count() - 别为了“一行”牺牲可读性和健壮性,PHP 不是 Golf 语言
空数组检查、非数字过滤、大数组内存控制——这三个点任何一个漏掉,线上就容易出静默偏差或崩溃。尤其 is_numeric() 的行为和直觉有出入(比如 is_numeric('0x1A') 返回 true),真遇到奇怪结果,先 dump 一眼过滤后的数组。











