usort函数结果错误

时间:2018-06-01 06:02:54

标签: php sorting usort

今天我提供了这个question的答案,我写了一个脚本,但我发现出了问题。

这是第一个脚本

<?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时,结果是错误的。为什么呢?

4 个答案:

答案 0 :(得分:5)

PHP手册中有关于usort()比较功能(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);

答案 1 :(得分:2)

PHP manual中有一个关于 teams = Team.search( query: { nested: { path: "players", query: { match: {"_id": "12345"} #Id of the team }, inner_hits: {size: 3} } } ) 的完整示例。这是解决您问题的修改版本:

usort

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

更新功能

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