2016-09-16 3 views
2

Ниже следует отсортировать массив водителей по возрастанию поясного времени:PHP usort объектов является возвращением неожиданного заказа

function sortDrivers($a, $b) 
{ 
    if (floatval($a->fastestLap) === floatval($b->fastestLap)) { 
    return 0; 
    } 
    return floatval($a->fastestLap) < floatval($b->fastestLap) ? -1 : 1; 
} 

Log::info("Before:"); 
foreach($drivers as &$driver){ 
    Log::info($driver->driverCode . " - " . floatval($driver->fastestLap)); 
} 

usort($drivers, "sortDrivers"); 

$position = 0; 
foreach($drivers as &$driver){ 
    $driver->position = ++$position; 
    $driver->save(); 
} 

Log::info("After:"); 
foreach($drivers as &$driver){ 
    Log::info($driver->driverCode . " - " . floatval($driver->fastestLap) . " - " . $driver->position); 
} 

Фактический выход из этого выглядит что-то вроде:

Before: 
Mark - 112.2 
Roger - 108.77 
Pete - 110.038 
Gary - 109.49 
Sid - 111.742 
Rod - 87.082 
Bob - 110.404 
Eric - 112.482 
Will - 113.478 
Nigel - 0 
Harry - 110.01 
Paul - 112.887 
Victor - 109.182 
Matt - 109.987 
Clive - 109.975 
Sol - 109.23 
Olly - 0 
Ben - 0 
Craig - 114.241 
Andy - 96.399 
Adam - 93.177 
Kel - 110.766 

After: 
Rod - 87.082 - 1 
Adam - 93.177 - 2 
Paul - 112.887 - 3 
Roger - 108.77 - 4 
Bob - 110.404 - 5 
Mark - 112.2 - 6 
Will - 113.478 - 7 
Gary - 109.49 - 8 
Pete - 110.038 - 9 
Harry - 110.01 - 10 
Matt - 109.987 - 11 
Craig - 114.241 - 12 
Eric - 112.482 - 13 
Sid - 111.742 - 14 
Kel - 110.766 - 15 
Clive - 109.975 - 16 
Sol - 109.23 - 17 
Victor - 109.182 - 18 
Andy - 96.399 - 19 
Olly - 0 - 20 
Nigel - 0 - 21 
Ben - 0 - 22 

Хотя есть очевидно, что некоторые тенденция к увеличению времени прохождения круга, несколько драйверов находятся в неправильном месте.

Почему?

+1

'floatval ($ a-> fastestLap) === floatval ($ b-> fastestLap)' является проигрышной ставкой. Никогда не ожидайте, что два значения с плавающей запятой будут равны. Сравните абсолютную величину их разности с небольшим порогом и считайте их равными, когда порог не будет превышен. Однако это не является причиной поведения, которое вы раскрываете здесь. – axiac

+0

Я не могу дублировать ваше поведение с помощью функции 'sortDrivers' - она ​​работает; -/Что бы то ни было, вот что-то, что кажется вам нужным: https://eval.in/643912. в .zero times sort last –

ответ

0

Извинения. Я использовал неправильную функцию сортировки, а не ту, что была выше.

 Смежные вопросы

  • Нет связанных вопросов^_^