PHP多维数组排序:学生成绩系统按平均分排序实现
按学生平均分排序多维数组的PHP方案
嘿,看来你正在搭建学生成绩系统,需要给这个多维数组按平均分排序对吧?在PHP里处理这种场景,用usort()配合自定义比较逻辑就非常方便,我给你几个实用的方案:
基础排序方案
1. 按平均分降序排序(从高到低)
这是最常用的成绩排序方式,直接用PHP的太空船运算符<=>就能简洁实现:
// 你的学生数据数组 $students = [ ['student' => 'STD-000001', 'marks' => 78, 'total_subjects' => 1, 'avarage' => 78], ['student' => 'STD-000002', 'marks' => 60.4, 'total_subjects' => 1, 'avarage' => 60.4], ['student' => 'STD-000013', 'marks' => 0, 'total_subjects' => 0, 'avarage' => 0], // 其他学生数据... ]; // 按平均分降序排序 usort($students, function($a, $b) { // 注意你的键名是'avarage'(拼写小失误),如果后续修正为'average'记得同步修改这里 return $b['avarage'] <=> $a['avarage']; });
2. 按平均分升序排序(从低到高)
只需要调换比较参数的顺序即可:
usort($students, function($a, $b) { return $a['avarage'] <=> $b['avarage']; });
特殊场景处理:将无考试记录的学生放到末尾
你的数组里有个total_subjects为0的学生,平均分是0,如果想把这类学生统一放到排序结果的最后(不管升序还是降序),可以调整比较逻辑:
usort($students, function($a, $b) { // 标记是否为无考试记录的学生 $aHasNoExams = ($a['total_subjects'] == 0 && $a['avarage'] == 0); $bHasNoExams = ($b['total_subjects'] == 0 && $b['avarage'] == 0); if ($aHasNoExams && !$bHasNoExams) { return 1; // 让无考试记录的a排在后面 } elseif (!$aHasNoExams && $bHasNoExams) { return -1; // 让无考试记录的b排在后面 } else { // 正常按平均分降序排序,升序的话换成$a['avarage'] <=> $b['avarage'] return $b['avarage'] <=> $a['avarage']; } });
兼容旧PHP版本的方案
如果你的PHP版本低于7.0(不支持太空船运算符),可以用传统的比较方式:
usort($students, function($a, $b) { if ($a['avarage'] == $b['avarage']) { return 0; } // 降序排序:平均分高的在前,返回1/-1控制顺序 return ($a['avarage'] < $b['avarage']) ? 1 : -1; });
最后提醒下:你的数组里平均分的键名是avarage,正确拼写是average,如果后续修正键名的话,记得同步修改代码里对应的键名哦~
内容的提问来源于stack exchange,提问作者sh2ka
相关产品推荐
相关产品推荐

