PHP usort()比较函数返回bool已废弃,代码如何修改?
解决PHP中usort()的废弃警告并正确处理排序方向
你说得对,**太空船运算符(<=>)**确实是解决这个废弃警告的核心,但还要结合你的排序方向(asc/desc)来调整,不然排序结果会和预期不符哦!
先说说原代码的问题:之前的比较函数返回的是布尔值(true/false),从PHP 7.4开始就会触发这个废弃警告,到PHP 8.0+更是直接不支持这种写法——因为usort()要求比较函数必须返回整数:小于0表示$a排在$b前面,等于0表示两者相等,大于0表示$a排在$b后面。布尔值会被强制转换成整数(true=1,false=0),这不符合规范,所以才会警告。
回到你的疑问:只写return $a[$sortField] <=> $b[$sortField];只能处理**升序(asc)**的情况,因为太空船运算符的规则正好匹配升序:
- 如果
$a[$sortField] > $b[$sortField],返回1 →$a排在$b后面 - 如果两者相等,返回0 → 相对位置不变(正好利用PHP 8的稳定排序特性)
- 如果
$a[$sortField] < $b[$sortField],返回-1 →$a排在$b前面
但如果是降序(desc),你需要把这个结果取反,或者交换$a和$b的位置来实现。这里给你两种修正后的完整代码:
方法一:通过取反调整排序方向
// sorting $sortField = $this->sortField; $sortDir = $this->sortDir; usort($data, function ($a, $b) use ($sortField, $sortDir) { // 先获取升序的比较结果 $comparison = $a[$sortField] <=> $b[$sortField]; // 降序就取反结果 return $sortDir === 'asc' ? $comparison : -$comparison; });
方法二:交换$a和$b的位置实现降序
// sorting $sortField = $this->sortField; $sortDir = $this->sortDir; usort($data, function ($a, $b) use ($sortField, $sortDir) { return $sortDir === 'asc' ? $a[$sortField] <=> $b[$sortField] : $b[$sortField] <=> $a[$sortField]; });
另外补充一下:PHP 8的稳定排序特性和这个调整完全不冲突——稳定排序是指当两个元素比较结果相等时,它们在原数组中的相对位置会被保留,而我们的比较函数只是规范了返回值,反而能更好地发挥稳定排序的作用哦。
内容的提问来源于stack exchange,提问作者Singleton
相关产品推荐
相关产品推荐

