Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço para classificar valores de matriz com valores duplicados e pular algumas posições se houver um empate?


Presumo que as notas já estejam classificadas pelo banco de dados, caso contrário, use sort($grades); .

Código:
$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];
}

Resultado:
92 - 1
84 - 2
84 - 2
84 - 2
83 - 5
65 - 6
41 - 7
38 - 8
38 - 8
37 - 10

EDITAR (Resposta à discussão abaixo)

Aparentemente, caso o empate ocorra na pontuação mais baixa,
a classificação de todas as pontuações mais baixas deve ser igual à contagem total de pontuações.


Código:
$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];
}

Resultado:
92 - 1
84 - 2
84 - 2
84 - 2
83 - 5
65 - 6
41 - 7
38 - 8
37 - 10
37 - 10