
本文介绍在 php 中正确统计学生各科成绩等级(如 a、b、c)出现频次的方法,解决因逻辑位置错误导致重复输出、计数失效的问题,并提供结构清晰、可维护的实现方案。
在生成学生成绩单时,常需汇总各成绩等级(如 A、B+、C)的出现次数,用于呈现整体学业表现。但初学者易犯一个典型错误:在遍历每科成绩时就立即统计并输出单个等级——这会导致每个等级被单独计为 1,而非累计总数(例如本例中应输出 B=2,却得到 B=1 B=1)。
根本原因在于:原代码将 array_count_values([$grade]) 放在 foreach ($subjectScores as $value) 循环内部,每次仅对单个 grade 构造数组并计数,既低效又逻辑错误;同时缺少花括号闭合,进一步加剧执行异常。
✅ 正确做法是采用「两阶段处理」:
- 收集与累加:遍历所有科目,动态构建关联数组 $grades_count,以等级为键、出现次数为值;
- 统一输出:全部处理完毕后,再遍历该数组输出最终统计结果。
以下是优化后的完整实现(含注释):
本文档主要讲述的是fortran语言语法;FORTRAN是世界上最早出现的高级编程语言,是工程界最常用的编程语言,它在科学计算中(如航空航天、地质勘探、天气预报和建筑工程等领域)发挥着极其重要的作用。经过40多年的发展,伴随着FORTRAN语言多次版本的更新及相应开发系统的出现,其功能不断完善,最新版本的开发系统几乎具备了VC、VB的所有特点,如图形界面编程、数据库等。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
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 传递给模板引擎渲染;
- 对于大数据量场景,建议将统计逻辑移至模型层或服务类,分离关注点。
通过此方案,你将获得准确、高效且易于扩展的成绩等级频次统计能力。









