php 7.5中usort回调必须返回整数,否则类型强制转换会导致排序错乱;正确做法是用减法、strcmp、或显式判断返回-1/0/1,并可加is_int断言调试。

PHP 7.5 中 usort 回调函数若返回非整数(比如 bool、float 或 null),会导致排序结果不可预测——因为 PHP 会将这些值强制转为整数:true → 1、false → 0、0.9 → 0,从而让本该区分大小关系的比较变成“相等”或“单向偏移”,最终打乱顺序。
核心问题:返回值类型不合规
常见错误写法:
-
return $a > $b;→ 返回true/false(即1/0),无法表达“$a 小于 $b”的情况 -
return strcmp($a, $b) > 0;→ 同样只返回布尔值,丢失负数分支 -
return $a['score'] - $b['score'] * 1.5;→ 结果是 float,可能被截为 0(如 0.2 → 0)
正确写法:始终返回整数
确保回调函数严格返回 -1、0 或 1(或任意负/正整数,但推荐标准值):
- 数值比较用减法:
return $a['age'] - $b['age']; - 字符串比较用
strcmp:return strcmp($a['name'], $b['name']); - 多条件组合时嵌套判断:
if ($a['type'] !== $b['type']) return $a['type'] $b['type']; return $a['priority'] - $b['priority']; - 安全处理 null 值:
$aVal = $a['value'] ?? 0; $bVal = $b['value'] ?? 0; return $aVal $bVal;
推荐使用太空船操作符()
PHP 7+ 支持三路比较运算符,自动处理类型转换并返回 -1/0/1:
-
return $a['price'] $b['price'];(升序) -
return $b['created_at'] $a['created_at'];(时间倒序) - 它比
strcmp更通用,也比手动 if 判断更简洁可靠
调试技巧:加类型断言
开发阶段可在回调开头加入检查,快速暴露问题:
usort($data, function($a, $b) {<br> $ret = $a['score'] $b['score'];<br> if (!is_int($ret)) {<br> throw new \LogicException("usort callback returned non-integer: " . gettype($ret));<br> }<br> return $ret;<br>});php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











