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,
    ),
    // 其他学生...
  )
<?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']);
}
?>

// 原始学生数据
$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,
    ),
    // 其他学生...
);

// 按学校分组排序
$schools = array();
foreach ($students as $student) {
    $school = $student['school'];
    if (!isset($schools[$school])) {
        $schools[$school] = array();
    }
    $schools[$school][] = $student;
}

// 对每个学校的学生进行排序
foreach ($schools as $school => $students) {
    // 按成绩降序排序
    usort($students, function ($a, $b) {
        return $b['zongfen'] - $a['zongfen'];
    });

    // 计算并设置排名
    $previousRank = null;
    $previousScore = null;
    $rankCount = 0;
    foreach ($students as $student) {
        if ($student['zongfen'] != $previousScore) {
            $previousRank = $rankCount + 1;
            $previousScore = $student['zongfen'];
        }
        $student['rank'] = $previousRank;
        $rankCount++;
    }

    // 更新排序后的学生数据
    $schools[$school] = $students;
}

// 打印结果
foreach ($schools as $school => $students) {
    echo "学校: $school\n";
    foreach ($students as $student) {
        echo "学生: {$student['name']}, 成绩: {$student['zongfen']}, 排名: {$student['rank']}\n";
    }
    echo "\n";
}