我正在开发一个操纵大学生考试成绩的数据库。基本上,我从一个MySq数据库中提取记录,在任何给定时间播放一个类。我希望对学生进行排名,其中最高的人数为1 这是一个例子;
Marks: 37, 92, 84, 83, 84, 65, 41, 38, 38, 84.
所以我想将mysql数据捕获为单个数组。一旦我有一个数组中的数据,我应该为每个学生分配一个位置,如1/10(数字1,92分),4/10等。现在的问题是,如果有一个平局,然后下一个分数跳过一个位置,如果在一个位置有3个分数,则下一个分数跳过2个位置。所以上面的分数排名如下;
92 - 1
84 - 2,
84 - 2,
84 - 2,
83 - 5,
65 - 6,
41 - 7,
38 - 8,
38 - 8 ,
37 - 10
评分系统要求保持位置数量(等级,如果你愿意),所以我们最终在这个等级中有10个职位,因为职位3,4,5和9没有任何占用者。 (填写每个数字的替代方案只会给我们8个职位!)
是否有可能(人类可能/ php可能)使用PHP对上述分数进行排名,以便能够处理可能的关系,例如在一个位置获得4分?很可能,我无法想出这样做的功能。我需要一个PHP函数(或者某些东西...... PHP)来获取数组并产生如上所述的排名。
任何帮助都将深表感谢,不过我认为我可能会要求太多。如果可以使用MySQL查询数据执行此操作而不将其放在数组中,那么这也会有所帮助!
答案 0 :(得分:5)
我认为成绩已经按数据库排序,否则使用sort($grades);
。
<强>代码:强>
$grades = array(92, 84, 84, 84, 83, 65, 41, 38, 38, 37);
$occurrences = array_count_values($grades);
$grades = array_unique($grades);
foreach($grades as $grade) {
echo str_repeat($grade .' - '.($i+1).'<br>',$occurrences[$grade]);
$i += $occurrences[$grade];
}
<强>结果:强>
92 - 1
84 - 2
84 - 2
84 - 2
83 - 5
65 - 6
41 - 7
38 - 8
38 - 8
37 - 10
编辑 (对以下讨论的回应)
显然,如果领带发生在最低分,则
所有最低分的等级应该等于总分数。
代码:
$grades = array(92, 84, 84, 84, 83, 65, 41, 38, 37, 37);
$occurrences = array_count_values($grades);
$grades = array_unique($grades);
foreach($grades as $grade) {
if($grade == end($grades))$i += $occurrences[$grade]-1;
echo str_repeat($grade .' - '.($i+1).'<br>',$occurrences[$grade]);
$i += $occurrences[$grade];
}
结果:
92 - 1
84 - 2
84 - 2
84 - 2
83 - 5
65 - 6
41 - 7
38 - 8
37 - 10
37 - 10
答案 1 :(得分:1)
$scores = array(92, 84, 84, 84, 83, 65, 41, 38, 38, 37);
$ranks = array(1);
for ($i = 1; $i < count($scores); $i++)
{
if ($scores[$i] != $scores[$i-1])
$ranks[$i] = $i + 1;
else
$ranks[$i] = $ranks[$i-1];
}
print_r($ranks);
答案 2 :(得分:0)
我需要最终得到一个值排列的地图。对于原始问题,这种方法可能更有效。
public static function getGrades($grades)
{
$occurrences = array_count_values($grades);
krsort($occurrences);
$position = 1;
foreach ($occurrences as $score => $count) {
$occurrences[$score] = $position;
$position += $count;
}
return $occurrences;
}
如果你在$ timess上print_r,你得到
Array
(
[92] => 1
[84] => 2
[83] => 5
[65] => 6
[41] => 7
[38] => 8
[37] => 10
)
基于原始答案,谢谢!