有一个这样的数组里面有两个学校混合的学生成绩 ,我想要每个学生在自己的学校所在排名,并且成绩相同排名并列,下一名得排名需要增加上面并列名次得数量
$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";
}