Я работаю над базой данных, которая манипулирует результатами экзаменов студентов колледжа. В основном, я вытаскиваю записи из базы данных 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 без наличия в массиве, то это также будет полезно!
Я предполагаю, что оценки уже отсортированы по базе данных, в противном случае используйте 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
EDIT (ответ на обсуждение ниже)
Видимо, в случае, если связь происходит с наименьшим счетом,
рейтинг всех младших баллов должен быть равен суммарному счету баллов.
Код:
$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
$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);
Мне нужно было получить карту ценностей для ранжирования. Этот метод может быть более эффективным для исходного вопроса.
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; }
Если вы печатаете_r на $ встречах, которые вы получаете
Array ( [92] => 1 [84] => 2 [83] => 5 [65] => 6 [41] => 7 [38] => 8 [37] => 10 )
Основываясь на исходном ответе, так спасибо!