#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>
Ответ №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.