通过比较浮点数列的一列,以降序方式对二维数组的行进行排序。

31
当我尝试应用以下代码从这里开始
usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

它以升序给我结果。

输出

0
0
0
0
0
0.29
1.09
6.33

在交换$a和$b后,它会按降序给出结果,除了一个值。
usort($myArray, function($a, $b) {
    return $b['order'] - $a['order'];
});

输出:

6.33
1.09
0
0
0
0
0.29
0

我希望以下结果按照以下顺序呈现:
6.33
1.09
0.29
0
0
0
0
0

如何才能达到相同的效果?

2
通过交换“a”和“b”。这里还有其他问题。 - user529758
那是我找不到的东西。 - 000
可能有一些元素被存储为字符串。尝试将其转换为某种数字类型。 - user529758
6个回答

42

我的第一个猜测是usort期望整数响应,如果返回值不是整数,它将四舍五入。在0.29与0进行比较时,结果为0.29(或-0.29),这将四舍五入为0。对于usort,0表示两个值相等。

尝试像这样做:

usort($myArray, function($a, $b) {
    if($a['order']==$b['order']) return 0;
    return $a['order'] < $b['order']?1:-1;
});

我认为那是正确的方向。要改变顺序,请将 < 改为 >


3
PHP需要一个 signum() 函数。BASIC 在40多年前就有了这个函数。 - Barmar

21

在PHP 7(及以上版本)中使用太空船操作符:

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

会返回升序排列的数组。反转比较将返回降序排列。

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

13

只需将 $a 和 $b 交换位置,代码如下:

function sort($a, $b){ 
return strcasecmp($b->order, $a->order);
}
usort($myArray, "sort");

5

我知道这已经过时了,但希望这能帮助到某个人。设置降序最简单的方法就是按下面所示乘以负一(-1)。对我来说很有效,文本也没问题。

function DESC($a, $b)
{
    return strcmp($a["text"], $b["text"])*-1;
}

usort($results,"DESC");

4
您可以在排序后直接反转数组。
开始的方式与您之前相同:
usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

然后像这样反转结果:
$myArray = array_reverse($myArray);

-2

usort是一个函数,它使用用户定义的比较函数(回调)按值对数组进行排序。

根据文档,回调比较函数必须返回一个整数,如果第一个参数被认为小于、等于或大于第二个参数,则分别返回小于零、等于零或大于零。

如果有像[0, 0.29]这样的值,并返回类似($a - $b)的东西,比较函数将返回(0-0.29=-0.71),这是浮点数,但期望是整数。您不应该使用"-"运算符。尝试用"<=>"替换它。下面是一个例子。

$arr = [0, 0, 0, 0, 0, 0.29, 1.09, 6.33];

usort($arr, function ($a, $b) {
    if ($a == $b) {
        return 0;
    } else {
        return $b <=> $a;
    }
});

print_r($arr);

感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。一个适当的解释将大大提高其长期价值,因为它展示了为什么这是一个好的问题解决方案,并使它更有用于未来读者的其他类似问题。请编辑您的答案以添加一些解释,包括您所做出的假设。 - helvete
@helvete 这样好一些了,还是我应该建议作者参考文档? - Serhiy Gavrylov
if ($a == $b) { return 0; } else { 这段代码是完全不必要的。@DazBaldwin 的回答才是正确的方式。研究人员不应在他们的应用程序中使用这个答案。我已经投票删除这个次优的答案。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接