php usort()在按具有浮点值的列排序时给出意外结果[重复]

lztngnrs  于 2023-04-04  发布在  PHP
关注(0)|答案(4)|浏览(106)

此问题在此处已有答案

Sort Multi-dimensional array by decimal values(6个答案)
23小时前关门了。
今天我提供了这个问题的答案,我写了一个脚本,但我发现有些地方出错了。
这是第一个脚本

<?php 
$array = array( 
            "0" => array (
               "id" => 1204,
               "custom_price" => 33.1500    
            ),
            
            "1" => array (
               "id" => 1199,
               "custom_price" => 15.83  
            ),
            
            "2" => array (
               "id" => 1176,
               "custom_price" => 16.83  
            )
         );

usort($array, function($a, $b) {
    return $a['custom_price'] - $b['custom_price'];
});
echo "<pre>";
print_r($array);

它的输出是(也可以检查output on sandbox

<pre>Array
(
    [0] => Array
        (
            [id] => 1176
            [custom_price] => 16.83
        )

    [1] => Array
        (
            [id] => 1199
            [custom_price] => 15.83
        )

    [2] => Array
        (
            [id] => 1204
            [custom_price] => 33.15
        )

)

所以,我想要的输出应该是类似(custom_price 15.83, 16.83, 33.15000)的排序,但实际输出是(custom_price 16.83,15.83,33.15000)。你可以看到15.83是16.83中最小的。排序结果是错误的。
因此,当我将custom_price 15.83更改为14.83时,排序输出是正确的

<pre>Array
(
    [0] => Array
        (
            [id] => 1199
            [custom_price] => 14.83
        )

    [1] => Array
        (
            [id] => 1176
            [custom_price] => 16.83
        )

    [2] => Array
        (
            [id] => 1204
            [custom_price] => 33.15
        )

)

you can see output on sandbox
我不明白这是怎么回事...有什么想法吗?

**我的问题是:**我检查了每个迭代,但无法识别问题。当custom_price为15.83时,结果是错误的。为什么?

c86crjj0

c86crjj01#

PHP手册中有一条关于usort() compare函数返回值的警告(位于http://php.net/manual/en/function.usort.php#refsect1-function.usort-parameters)...

注意事项如果比较函数返回非整数值,比如float,会导致回调函数返回值内部转换为整数,所以0.99和0.1都会转换为整数0,比较结果是相等的。

同样在PHP 7中,你可以使用飞船操作符<=>,它根据两个值的比较结果返回1,0,-1。

usort($array, function($a, $b) {
    return $a['custom_price'] <=> $b['custom_price'];
});

echo "<pre>";
print_r($array);
bmvo0sr5

bmvo0sr52#

PHP手册中有一个关于usort的完整示例。下面是修改后的版本,可以解决您的问题:

<?php
function cmp($a, $b)
{
    if ($a['custom_price'] == $b['custom_price']) {
        return 0;
    }
    return ($a['custom_price'] < $b['custom_price']) ? -1 : 1;
}
8zzbczxx

8zzbczxx3#

下面的代码将解决您的问题,

usort($array, function($a, $b) {
    if($a['custom_price']==$b['custom_price']) return 0;
    return $a['custom_price'] > $b['custom_price'] ? 1 : -1;
});
vatpfxk5

vatpfxk54#

更新功能

usort($array, function($a, $b) {
    return $a['custom_price'] > $b['custom_price'];
});

相关问题