Intereting Posts
Обновите содержимое div только в том случае, если в базу данных добавлен новый контент Почему debug_backtrace () иногда не включает номер строки? Перемещение Вход или Регистрация Ссылка на верхние ссылки в навигации по заголовку – Magento Невозможно использовать возвращаемое значение метода в контексте записи Почему приложение Symfony2 тратит 70-90% своего времени на анализ YAML? Проверьте, существует ли база данных (MySQL), и если она не создается в PHP Как обрезать таблицу с помощью Doctrine 2? Выделение слов в Javascript – Почему они не будут выделены после полной загрузки страницы? Data Mapper – следует ли использовать инъекцию зависимостей? где является фатальной ошибкой «Не удается получить доступ к пустому свойству» в функции класса PHP? PHP обратный к матрице Поиск близости как установить posix в php Назначить значение jquery переменной php WordPress slug без специального типа сообщений

Как ранжировать значения массива с повторяющимися значениями и пропускать некоторые позиции, если есть связь?

Я работаю над базой данных, которая манипулирует результатами экзаменов студентов колледжа. В основном, я вытаскиваю записи из базы данных 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 ) 

Основываясь на исходном ответе, так спасибо!