如果存在平局,如何使用重复值对数组值进行排名并跳过某些位置?

时间:2011-05-28 17:26:15

标签: php mysql

我正在开发一个操纵大学生考试成绩的数据库。基本上,我从一个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查询数据执行此操作而不将其放在数组中,那么这也会有所帮助!

3 个答案:

答案 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
)

基于原始答案,谢谢!