如何统计学生成绩单中各等级出现的次数

19次阅读

如何统计学生成绩单中各等级出现的次数

本文介绍在 php 中正确统计学生各科成绩等级(如 a、b、c)出现频次的方法,解决因逻辑位置错误导致重复输出、计数失效的问题,并提供结构清晰、可维护的实现方案。

在生成学生成绩单时,常需汇总各成绩等级(如 A、B+、C)的出现次数,用于呈现整体学业表现。但初学者易犯一个典型错误:在遍历每科成绩时就立即统计并输出单个等级——这会导致每个等级被单独计为 1,而非累计总数(例如本例中应输出 B=2,却得到 B=1 B=1)。

根本原因在于:原代码将 array_count_values([$grade]) 放在 foreach ($subjectScores as $value) 循环内部,每次仅对单个 grade 构造数组并计数,既低效又逻辑错误;同时缺少花括号闭合,进一步加剧执行异常。

✅ 正确做法是采用「两阶段处理」:

  1. 收集与累加:遍历所有科目,动态构建关联数组 $grades_count,以等级为键、出现次数为值;
  2. 统一输出:全部处理完毕后,再遍历该数组输出最终统计结果。

以下是优化后的完整实现(含注释):

tot_score >= 90 && $value->tot_score <= 100) {         $grade = 'A+';         $remark = 'DISTINCTION';     } elseif ($value->tot_score >= 80 && $value->tot_score <= 89.99) {         $grade = 'A';         $remark = 'EXCELLENT';     } elseif ($value->tot_score >= 70 && $value->tot_score <= 79.99) {         $grade = 'B+';         $remark = 'VERY GOOD';     } elseif ($value->tot_score >= 60 && $value->tot_score <= 69.99) {         $grade = 'B';         $remark = 'GOOD';     } elseif ($value->tot_score >= 50 && $value->tot_score <= 59.99) {         $grade = 'C';         $remark = 'ABOVE AVERAGE';     } elseif ($value->tot_score >= 45 && $value->tot_score <= 49.99) {         $grade = 'D';         $remark = 'AVERAGE';     } elseif ($value->tot_score >= 40 && $value->tot_score <= 44.99) {         $grade = 'E';         $remark = 'FAIR';     } else { // 简化边界处理:0–39.99 → F         $grade = 'F';         $remark = 'NEEDS IMPROVEMENT';     }      // 安全累加:若该等级尚未存在,则初始化为 0,再 +1     $grades_count[$grade] = ($grades_count[$grade] ?? 0) + 1; }  // 第二阶段:统一输出统计结果(格式如 "B=2 C=1") foreach ($grades_count as $grade => $count) {     echo "$grade=$count "; } ?>

? 关键改进说明

  • 使用 ?? 0 空合并运算符替代冗长的 isset() 判断,代码更简洁健壮;
  • 所有 php 逻辑统一包裹在一对 中,避免频繁开关标签,提升可读性与可维护性;
  • 等级判定逻辑未改动,确保业务一致性;仅重构统计流程,符合单一职责原则。

? 扩展建议

  • 若需按字母顺序输出(如 A+=1 A=1 B=2 C=1),可在第二阶段前添加 ksort($grades_count);;
  • 如需 html 表格或图表展示,可将 $grades_count 传递给模板引擎渲染;
  • 对于大数据量场景,建议将统计逻辑移至模型层或服务类,分离关注点。

通过此方案,你将获得准确、高效且易于扩展的成绩等级频次统计能力。

text=ZqhQzanResources