usort函数通过自定义比较函数实现数组排序,需返回负数($a在$b前)、正数($a在$b后)或0(相等),不可返回布尔值;数字用减法、字符串用strcmp;支持多条件排序和null安全处理。

PHP 的 usort 函数让你能用自定义逻辑对数组排序,关键在于写好比较函数——它决定两个元素谁排在前、谁排在后。
理解比较函数的返回值含义
比较函数必须接收两个参数(比如 $a 和 $b),并返回整数:
- 返回 负数(如 -1):表示
$a应该排在$b前面 - 返回 正数(如 1):表示
$a应该排在$b后面 - 返回 0:表示两者相等,顺序可保持不变
别直接返回布尔值或字符串比较结果,否则排序会出错。常见错误是写成 return $a > $b; ——这只会返回 true/false(即 1/0),无法表达“小于”关系。
按二维数组某个字段升序/降序排序
比如有用户数据数组,想按年龄升序排列:
立即学习“PHP免费学习笔记(深入)”;
$users = [
['name' => '张三', 'age' => 28],
['name' => '李四', 'age' => 22],
['name' => '王五', 'age' => 35]
];
<p>usort($users, function($a, $b) {
return $a['age'] - $b['age']; // 升序
});
// 结果:李四(22) → 张三(28) → 王五(35)
若要降序,把减法反过来:return $b['age'] - $a['age'];。注意:用减法适用于数字;字符串要用 strcmp() 或 strcasecmp()(忽略大小写)。
多条件复合排序(先按A,再按B)
当主字段相等时,需进一步比较次字段。例如先按城市升序,城市相同时按姓名升序:
usort($users, function($a, $b) {
// 先比城市
$cityCmp = strcmp($a['city'], $b['city']);
if ($cityCmp !== 0) {
return $cityCmp;
}
// 城市相同,再比姓名
return strcmp($a['name'], $b['name']);
});
逻辑清晰:只要第一个条件能分出大小,就立刻返回;只有相等时才进入下一轮比较。避免嵌套过深,可逐层用 return 提前退出。
处理 NULL、空值或类型不一致的安全写法
真实数据常含 null、空字符串或混合类型。直接访问可能触发 Notice 或排序异常。推荐提前归一化:
- 用
??提供默认值:($a['score'] ?? 0) - 统一转为字符串再比较:
strval($a['id']) - 检查类型再分支:
is_numeric($a['price']) ? $a['price'] : 0
例如安全地按评分排序(允许 null):
usort($items, function($a, $b) {
$scoreA = $a['score'] ?? -99999;
$scoreB = $b['score'] ?? -99999;
return $scoreB - $scoreA; // 降序,null 排最后
});
usort 灵活但细节决定成败——写对比较函数的返回逻辑、适配数据特征、兼顾边界情况,排序就能稳又准。











