如何优雅计算二维数组及关联数组的各列平均值?
优雅计算数组列平均值的实用方案
嘿,针对你提出的两个计算列平均值的需求,我整理了几种简洁且可读性拉满的实现方式,不用写冗余的嵌套循环,逻辑清晰还高效:
需求1:普通二维数组的列平均值计算
先假设我们有个典型的二维数组:
$matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];
简洁实现技巧
用PHP内置数组函数的组合,核心逻辑一行就能搞定:
$columnAverages = array_map( fn($col) => array_sum($col) / count($col), array_map(null, ...$matrix) );
逻辑拆解
array_map(null, ...$matrix):这是PHP里转置二维数组的经典小技巧,直接把原数组的行和列互换,原来的每一列瞬间变成了转置后的行- 外层的
array_map遍历转置后的每一行(也就是原数组的列),算总和除以元素个数,直接得到列平均值
需求2:关联数组集合的列平均值(输出扁平关联数组)
假设我们有一组结构统一的关联数组,比如:
$data = [ ['a' => 10, 'b' => 20, 'c' => 30], ['a' => 20, 'b' => 40, 'c' => 60], ['a' => 30, 'b' => 60, 'c' => 90] ];
优雅实现方式
先拿到所有键名,再逐个键计算对应值的平均值,最后组装成扁平的关联数组:
// 先获取所有键(假设所有子数组结构一致) $keys = array_keys(reset($data)); // 用array_reduce遍历计算平均值 $averages = array_reduce($keys, function($result, $key) use ($data) { $values = array_column($data, $key); $result[$key] = array_sum($values) / count($values); return $result; }, []);
逻辑说明
array_keys(reset($data)):取第一个子数组的键,前提是所有子数组的键都一致;如果键可能不一致,就用$keys = array_unique(array_merge(...array_map('array_keys', $data)));先合并去重所有键array_column可以直接提取所有子数组中对应键的取值,省去手动循环取值的麻烦- 如果是PHP 7.4及以上版本,用箭头函数能让代码更短:
$averages = array_combine( $keys = array_keys(reset($data)), array_map(fn($k) => array_sum(array_column($data, $k)) / count($data), $keys) );
额外优化提示
- 如果数组里可能有空值或者子数组长度不一致,可以把
count($col)换成count(array_filter($col)),排除空值后再计算平均值 - 这些方法都是用PHP内置数组函数实现的,比手动写嵌套循环效率更高,大数据量下也能稳定运行
内容的提问来源于stack exchange,提问作者realnsleo
相关产品推荐
相关产品推荐

