PHP 7+ 推荐用飞船运算符()配合 usort/uasort 实现安全排序:它天然返回 -1/0/1,避免减法溢出与类型错误;支持 null 安全比较、多字段数组解构排序;中文需 Collator 扩展实现拼音序。

usort 回调里直接用 就行
PHP 7+ 的 (飞船运算符)天然适配 usort 要求的返回值:-1、0、1。它比手写 if 判断或减法更安全,尤其对字符串、null、对象等类型不会出错。
常见错误是误用减法:$a['age'] - $b['age'] 在浮点数或超大整数时可能溢出或丢失精度;而 $a['age'] $b['age'] 始终返回整型结果。
- 对数字字段排序,直接比较:
return $a['score'] $b['score']; - 对字符串字段排序,也直接比较:
return $a['name'] $b['name'];(注意:这是字节序比较,非 Unicode 意义上的“中文排序”) - 字段可能为
null?本身支持null安全比较,null 'abc'返回 -1,无需额外判断
多字段排序别嵌套 if,用数组解构更干净
要先按 status 升序,再按 created_at 降序,很多人写一堆 if ($retval === 0),其实没必要。
PHP 支持数组比较:两个数组用 比较时,会逐项比对,遇到第一个不等就返回结果。升序字段放左边,降序字段把顺序倒过来即可。
立即学习“PHP免费学习笔记(深入)”;
- status 升序 + created_at 降序:
return [$a['status'], $b['created_at']] [$b['status'], $a['created_at']]; - status 升序 + name 升序:
return [$a['status'], $a['name']] [$b['status'], $b['name']]; - 注意:字段类型必须一致,比如
created_at是时间戳整数才能直接比;如果是字符串格式(如'2026-08-31'),也能比,但得确认格式统一
排序后键名丢失?该用 uasort 还是 usort
usort 会重置数字键名(变成 0,1,2…),丢弃原始键;uasort 保留关联键名,适合你依赖 $arr['user_123'] 这类结构的场景。
容易踩的坑是:明明数组有字符串键,却用了 usort,结果 foreach ($arr as $key => $val) 里 $key 变成数字了,逻辑崩了。
- 需要保持键名 → 用
uasort($arr, fn($a, $b) => $a['order'] $b['order']); - 只关心值顺序,不care键名 → 用
usort更轻量 - 两者回调函数写法完全一样,区别只在函数名和是否保留键
中文姓名排序不能只靠
$a['name'] $b['name'] 对中文实际是按 UTF-8 字节比较,张(E5BCA0)会排在 李(E69DA8)前面——但这不是拼音序,也不是笔画序,纯属编码顺序,业务上通常不可接受。
真要按拼音排序,得借助 collator 扩展:
$collator = new Collator('zh_CN');
usort($arr, function($a, $b) use ($collator) {
return $collator->compare($a['name'], $b['name']);
});
没装扩展?至少加个 mb_strtolower() 防大小写干扰,但依然不是拼音序——这点常被忽略,上线后才发现“王五”排在“张三”后面。



















