неправильный результат функции usort - PullRequest
0 голосов
/ 01 июня 2018

Сегодня я дал ответ на этот вопрос и написал сценарий, но обнаружил, что что-то пошло не так.

Вот первый сценарий

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

и его вывод (также вы можете проверить вывод в песочнице )

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

)

вы можете увидеть вывод в песочнице

Я не могу понять, что происходит ... есть идеи по этому поводу?

Мой вопрос: Я проверяю каждую итерацию, но не могу определить проблему.когда custom_price равен 15,83, результат неверен.почему?

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

В руководстве по 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);
0 голосов
/ 01 июня 2018

Полный пример приведен в руководстве 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;
}
0 голосов
/ 01 июня 2018

Ниже код решит вашу проблему,

usort($array, function($a, $b) {
    if($a['custom_price']==$b['custom_price']) return 0;
    return $a['custom_price'] > $b['custom_price'] ? 1 : -1;
});
0 голосов
/ 01 июня 2018

Обновлена ​​функция

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