【问题标题】:Why can this usort() function not properly sort decimals?为什么这个 usort() 函数不能正确排序小数?
【发布时间】:2016-04-19 23:42:56
【问题描述】:

为什么小数排序不正确:

13
11
14
10
12.5
---------------------------------------------------------
descending order:
14
12.5
13
11
10

使用此代码:

class Customer {
    public $score;
    public function __construct($score) {
        $this->score = $score;
    }
}

$customers = [];
$customers[] = new Customer(13);
$customers[] = new Customer(11);
$customers[] = new Customer(14);
$customers[] = new Customer(10);
$customers[] = new Customer(12.5);

if(is_array($customers) && count($customers) > 0)
{
    foreach($customers as $customer)
    {
        echo '<div>'.$customer->score.'</div>';
    }
}

echo '<hr/>';
echo '<div>descending order:</div>';
usort($customers, function($a, $b) {
    return $b->score - $a->score;
});


if(is_array($customers) && count($customers) > 0)
{
    foreach($customers as $customer)
    {
        echo '<div>'.$customer->score.'</div>';
    }
}

【问题讨论】:

标签: php usort


【解决方案1】:

将十进制 0.5 转换为整数会将其更改为 0。将您的 usort 函数更改为:

usort($customers, function($a, $b) {
    if($b->score - $a->score >= 0){
        return 1;
    }
    return -1;
});

输出:

descending order:
14
13
12.5
11
10

PHP 手册说:

注意:从比较函数返回非整数值, 例如浮点数,将导致内部强制转换为整数 回调的返回值。所以像 0.99 和 0.1 这样的值都将是 强制转换为 0 的整数值,这将比较这些值 相等。

【讨论】:

  • 如果你已经在运行 PHP7,你可以利用新的 "spaceship" 操作符并进行回调return $b-&gt;score &lt;=&gt; $a-&gt;score;
  • usort() 应该能够返回 THREE 值。 0。你没有返回 0(等于),只是大于/小于。
【解决方案2】:

试试

usort($customers, function($a, $b) {
    return strnatcmp($b->score,$a->score);
});

【讨论】:

  • 谢谢@hvtruong,你节省了我很多时间
【解决方案3】:
usort($customers, function($a, $b) {
    return (int)$b->score - (int)$a->score;
});

例如,您的输入为14.9,1414.5,输出为14.9,1414.5,它被视为14.9=14,14.0=1414.5=14

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多