小基炖蘑菇· 2023-06-20 11:17 采纳率: 25%
浏览 35
已结题

php 成绩并列排序问题


有一个这样的数组里面有两个学校混合的学生成绩 ,我想要每个学生在自己的学校所在排名,并且成绩相同排名并列,下一名得排名需要增加上面并列名次得数量

$students = array(
    array(
        'id' => 72,
        'name' => '学生LL',
        'school' => '云校',
        'zongfen' => 330,
    ),
    array(
        'id' => 49,
        'name' => '学生A',
        'school' => '云校',
        'zongfen' => 300,
    ),
    array(
        'id' => 50,
        'name' => '学生B',
        'school' => '云校云校',
        'zongfen' => 295,
    ),
    // 其他学生...
  )
  • 写回答

2条回答 默认 最新

  • 梦幻编织者 2023-06-20 11:22
    关注
    <?php
    // 按照学校和总分进行排序
    usort($students, function($a, $b) {
        if ($a['school'] == $b['school']) {
            return $b['zongfen'] - $a['zongfen'];
        } else {
            return strcmp($a['school'], $b['school']);
        }
    });
    
    $rank = 1; // 排名从1开始
    $prevSchool = ''; // 上一个学校的名称
    $prevScore = 0; // 上一个学生的总分
    $prevRank = 0; // 上一个学生的排名
    
    foreach ($students as $student) {
        if ($student['school'] != $prevSchool) {
            // 如果这个学生的学校与上一个学生的学校不同,那么排名需要重置
            $rank = 1;
            $prevScore = 0;
            $prevRank = 0;
            $prevSchool = $student['school'];
        }
    
        if ($student['zongfen'] == $prevScore) {
            // 如果这个学生的总分与上一个学生的总分相同,那么排名并列
            $student['rank'] = $prevRank;
        } else {
            $student['rank'] = $rank;
            $prevRank = $rank;
        }
    
        $prevScore = $student['zongfen'];
        $rank += 1;
    }
    
    // 输出结果
    foreach ($students as $student) {
        printf("学生 %s 在 %s 的排名是 %d\n", $student['name'], $student['school'], $student['rank']);
    }
    ?>
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月20日
  • 修改了问题 6月20日
  • 修改了问题 6月20日
  • 创建了问题 6月20日