PHP关联数组每10元素分组求平均值的替代实现方法咨询
问题:PHP中对关联数组元素按每10个分组计算平均值的优化方法
我是编程新手,目前需要对关联数组中的元素按每10个为一组,分别求和后计算平均值。我已尝试以下PHP实现方式,但想了解是否存在其他更简洁或高效的实现方法?
我尝试的代码:
<?php $arr = array( "text"=>"1,1,1,1,1,1,3,4,4,4,2,2,4,3,5,5,5,5,5,5,5,5,2,4,3,3,2,3,3,3,4,3,3,3,3,3,3,3,3,4,1,4,1,1,4,2,2,2,2,3" ); foreach( $arr as $question=>$answer ) { $ext = ((Integer)$answer[0]+(Integer)$answer[2]+(Integer)$answer[4]+(Integer)$answer[6]+(Integer)$answer[8]+(Integer)$answer[10]+(Integer)$answer[12]+(Integer)$answer[14]+(Integer)$answer[16]+(Integer)$answer[18])/10.0; $est = ((Integer)$answer[20]+(Integer)$answer[22]+(Integer)$answer[24]+(Integer)$answer[26]+(Integer)$answer[28]+(Integer)$answer[30]+(Integer)$answer[32]+(Integer)$answer[34]+(Integer)$answer[36]+(Integer)$answer[38])/10.0; $agr = ((Integer)$answer[40]+(Integer)$answer[42]+(Integer)$answer[44]+(Integer)$answer[46]+(Integer)$answer[48]+(Integer)$answer[50]+(Integer)$answer[52]+(Integer)$answer[54]+(Integer)$answer[56]+(Integer)$answer[58])/10.0; $csn = ((Integer)$answer[60]+(Integer)$answer[62]+(Integer)$answer[64]+(Integer)$answer[66]+(Integer)$answer[68]+(Integer)$answer[70]+(Integer)$answer[72]+(Integer)$answer[74]+(Integer)$answer[76]+(Integer)$answer[78])/10.0; $opn = ((Integer)$answer[80]+(Integer)$answer[82]+(Integer)$answer[84]+(Integer)$answer[86]+(Integer)$answer[88]+(Integer)$answer[90]+(Integer)$answer[92]+(Integer)$answer[94]+(Integer)$answer[96]+(Integer)$answer[98])/10.0; echo($ext); echo("\n"); echo($est); echo("\n"); echo($agr); echo("\n"); echo($csn); echo("\n"); echo($opn); } ?>
计算逻辑:
- $ext:计算索引0-9对应元素的平均值
- $est:计算索引10-19对应元素的平均值
- $agr:计算索引20-29对应元素的平均值
- $csn:计算索引30-39对应元素的平均值
- $opn:计算索引40-49对应元素的平均值
当前输出结果:
2.1 4.1 3.3 3.2 2.2
优化实现方案
原代码直接通过字符串索引取值,依赖固定的逗号位置,不仅冗余易出错,维护性也差。下面是更简洁高效的实现:
优化代码:
<?php $arr = [ "text" => "1,1,1,1,1,1,3,4,4,4,2,2,4,3,5,5,5,5,5,5,5,5,2,4,3,3,2,3,3,3,4,3,3,3,3,3,3,3,3,4,1,4,1,1,4,2,2,2,2,3" ]; foreach ($arr as $answer) { // 把逗号分隔的字符串转成整数数组 $numbers = array_map('intval', explode(',', $answer)); // 按每10个元素自动分组 $groups = array_chunk($numbers, 10); // 分组名称对应顺序 $groupNames = ['ext', 'est', 'agr', 'csn', 'opn']; // 遍历分组计算平均值并输出 foreach ($groups as $idx => $group) { $average = array_sum($group) / 10.0; echo "{$groupNames[$idx]}: {$average}\n"; } } ?>
优化点说明:
- 健壮性提升:用
explode分割字符串,避免直接操作字符索引的局限性,即使字符串格式有微小变化(比如多了空格),只需添加trim或过滤处理即可适配。 - 代码简洁冗余少:借助
array_chunk自动分组、array_sum直接求和,替代重复的手动加法代码,大幅减少冗余。 - 维护性更强:如果分组数量、每组元素数需要调整,只需修改
array_chunk的参数或groupNames数组,无需逐段修改计算逻辑。 - 效率更高:PHP内置数组函数是底层C实现,比手动循环加法的执行效率更高,数据量越大优势越明显。
优化后输出:
ext: 2.1 est: 4.1 agr: 3.3 csn: 3.2 opn: 2.2
内容的提问来源于stack exchange,提问作者Ankur Guha
相关产品推荐
相关产品推荐

