【问题标题】:php usort objects is returning unexpected orderphp usort 对象返回意外的顺序
【发布时间】:2016-09-16 11:38:41
【问题描述】:

以下内容应按单圈时间升序对一组车手进行排序:

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  

虽然明显有增加单圈时间的趋势,但有几位车手走错了地方。

为什么?

【问题讨论】:

  • floatval($a-&gt;fastestLap) === floatval($b-&gt;fastestLap) 是一个失败的赌注。永远不要期望两个浮点值相等。将它们的差值的绝对值与一个小阈值进行比较,并在未超过阈值时认为它们相等。但是,这不是您在此处暴露的行为的原因。
  • 我无法使用您的“sortDrivers”功能复制您的行为 - 它可以工作;-/ 不管怎样,这似乎可以满足您的需求:eval.in/643912。即零次排序最后

标签: php usort


【解决方案1】:

抱歉。我使用了错误的排序功能,而不是上面发布的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多