必须显式判断数组非空且元素为数值:先用 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、数值计算结果变成 INF 或 NaN。
- 必须显式判断
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 类型转换规则处理:null → 0,false → 0,true → 1,字符串如 '1abc' → 1,'abc' → 0。这很容易掩盖脏数据问题。
使用场景:从数据库查出的字段没强类型约束、API 接口传入未校验的混合数组、日志解析后拼装的指标数组。
立即学习“PHP免费学习笔记(深入)”;
- 如果要求严格,先过滤:
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 更可控











