Как создать таблицу лидеров

#php #arrays

#php #массивы

Вопрос:

Привет всем, я только что создал этот код на php, где он выводит список всех студентов и их оценку от более высокой к более низкой, а после этого показывает топ-3 в зависимости от оценки.

 <?php

$Turma = array(

array("name" => "Diogo", "score" => "100", "time" => "6" ),
array("name" => "Joao","score" => "500", "time" => "3" ),
array("name" => "Miguel", "score" => "125", "score" => "8" ),
array("name" => "Daniela", "score" => "105", "time" => "7" ),
array("name" => "Joana", "score" => "100", "time" => "6" ),
array("name" => "Diogo", "score" => "275", "time" => "4" ),
array("name" => "Francisco", "score" => "300", "time" => "9" ),
array("name" => "Ines", "score" => "650", "time" => "2" ),
array("name" => "Dionisio", "score" => "101", "score" => "10" ),
array("name" => "Ricardo", "score" => "200", "score" => "8" ),
array("name" => "Fabio", "score" => "201", "score" => "11" ),
array("name" => "Tiago","score" => "50", "score" => "13" ),
array("name" => "Carolina", "score" => "150", "time" => "5" ), 
array("name" => "Rui", "score" => "130", "time" => "3" ),
array("name" => "Luisa", "score" => "1000", "time" => "1" ),

);


 usort($Turma, function($a,$b){
    return $b["score"] - $a["score"];


});

 foreach($Turma as $key => $value) {
    
    $position = $key   1;
    
    echo "{$position}: {$value['nome']} : {$value['score']} <br>";

}






echo "<br>";
echo "WINNERS!! <br> ";

foreach($Turma as $key => $value) {
    
    $position = $key   1;

    if ($position < 4) {
        echo "{$position}: {$value['nome']} : {$value['score']} <br>";
    }

    
}
  

Теперь я должен посмотреть, есть ли в основном списке какие-либо ничьи по количеству очков, и если это правда, то выигрывает самый быстрый, если есть ничья по количеству очков и времени, которое мы заказываем по их имени

Ответ №1:

Ваш код близок; вам просто нужно изменить обратный usort вызов, чтобы учесть поля time name ), когда поля score time ) равны:

 usort($Turma, function ($a, $b) {
    if ($a['score'] != $b['score']) return $b['score'] - $a['score'];
    if ($a['time'] != $b['time']) return $a['time'] - $b['time'];
    return strcmp($a['name'], $b['name']);
});

echo "<br>";
echo "WINNERS!! <br> ";
foreach ($Turma as $key => $value) {
    if ($key == 3) break;
    $position = $key   1;
    echo "{$position}: {$value['name']} : {$value['score']} <br>";
}
  

Вывод (для ваших выборочных данных):

 <br>WINNERS!! <br> 1: Luisa : 1000 <br>2: Ines : 650 <br>3: Joao : 500 <br>
  

Демо на 3v4l.org

Ответ №2:

Просто добавьте предложение в функцию usort, которая сравнивает время, если разница в счете равна 0.

 function($a, $b){
    $diff = doubleval($b["score"]) - doubleval($a["score"]);
    if($diff != 0) return $diff;
    return doubleval($b["time"]) - doubleval($a["time"]);
}
  

Кстати, некоторые из ваших записей массива, похоже, имеют дублирующийся ключ оценки, а не счет и ключ времени.

 array("name" => "Miguel", "score" => "125", "score" => "8" ),
  

Комментарии:

1. спасибо за ваш отзыв, должен ли я поместить эту функцию под частью usort?

2. Да, это заменило бы вашу встроенную функцию usort.