错误的结果 usort PHP 8

Wrong result usort PHP 8

提问人:jspit 提问时间:9/12/2022 更新时间:9/12/2022 访问量:225

问:

我有以下代码,应该将“BMW”排序到第一个位置:

$cars=['Toyota','Volvo','BMW'];
usort($cars,function($v){return $v <=> 'BMW';});
var_export($cars);

PHP7(及更小版本)的结果是正确的:

array ( 0 => 'BMW', 1 => 'Volvo', 2 => 'Toyota', )

据我了解,PHP8的结果是错误的。

array (0 => 'Volvo', 1 => 'BMW', 2 => 'Toyota',)

演示:https://3v4l.org/8SCXk

这不是由宇宙飞船操作员决定的。这个似乎工作正常。原因一定在于 usort 的行为。

var_dump(
    'Volvo' <=> 'BMW',
    'BMW' <=> 'Volvo',
    'BMW' <=> 'Toyota',
    'Toyota' <=> 'BMW',
    'BMW' <=> 'BMW'
    );

演示:https://3v4l.org/UaKrM

我的问题是:这是 PHP8 中令人讨厌的错误还是我需要更改我的代码?

PHP 数组 排序 usort

答:

1赞 KIKO Software 9/12/2022 #1

如果你有错误的回调函数,你会得到错误的结果。它应该是:

$cars = ['Toyota', 'Volvo', 'BMW'];
usort($cars, function ($a, $b) { return $a <=> $b; });
var_export($cars);

请注意第二个参数及其使用方式。$b

参见:usort() 和此处的示例:https://3v4l.org/X1DVU

你看到的与旧 PHP 版本的差异确实是由 PHP 8 切换到黑貂排序引起的,但这与你的情况无关。

评论

0赞 jspit 9/12/2022
我完全停电了。谢谢。
0赞 KIKO Software 9/12/2022
@jspit 它发生在我们所有人身上。我花了很长时间才发现它。