2016-09-16 15 views
2

を返すあるラップタイム昇順でドライバの配列をソートする必要があり、次のいくつかが明確ですがPHPは予期しない順序

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 

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); 
} 

このことから、実際の出力は、何かのように見えるがラップタイムが増加する傾向にあり、いくつかのドライバーが間違った場所にいる。

なぜですか?

+1

'floatval($ a-> fastestLap)=== floatval($ b-> fastestLap)'はゆるやかな賭けです。 2つの浮動小数点値が等しいとは決して期待しないでください。それらの差の絶対値を小さな閾値と比較し、閾値を超えない場合にそれらを等しく見なす。しかし、これはここで公開した行動の原因ではありません。 – axiac

+0

あなたの振る舞いをあなたの 'sortDrivers'関数で複製することはできません - それは動作します - /何でも、あなたが望むことをするようなものがあります:https://eval.in/643912。すなわち、最後にゼロ時間をソートする –

答えて

0

謝罪。私は間違った並べ替え機能を使用していましたが、上記のものはありません。

関連する問題