此问题在此处已有答案:
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时,结果是错误的。为什么?
4条答案
按热度按时间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。bmvo0sr52#
PHP手册中有一个关于
usort
的完整示例。下面是修改后的版本,可以解决您的问题:8zzbczxx3#
下面的代码将解决您的问题,
vatpfxk54#
更新功能