PHP 7.4+ 支持箭头函数配合 usort,因其单行语法、自动作用域绑定及严格双参数整数返回要求,显著简化二维数组或对象的多条件排序逻辑。

PHP 7.4+ 才能用箭头函数配合 usort,低版本会直接报错 Parse error: syntax error, unexpected '='。
为什么 usort + 箭头函数能少写一半代码
传统写法要先定义一个命名函数或匿名函数,再传给 usort;箭头函数把「参数声明 + 返回值」压缩成一行,且自动绑定作用域(不用 use 捕获外部变量)。
常见场景:按二维数组某个字段排序、按对象属性排序、多条件优先级排序。
- 箭头函数只支持单表达式,不能写多行或带语句(比如
if、return) - 参数类型必须明确——
usort固定传两个元素,所以箭头函数形参只能是两个,例如fn($a, $b) => ... - 返回值必须是整数:
0(相等)、>0($a 排后)、($a 排前)
usort 箭头函数里怎么比较字符串或数字字段
别直接用 $a['name'] $b['name']——如果某条数据缺失 'name' 键,会触发 Notice: Undefined index,但排序仍继续,结果可能错乱。
立即学习“PHP免费学习笔记(深入)”;
安全写法是加空合并(??)兜底:
$data = [['name' => 'zhang'], ['name' => 'li'], []]; usort($data, fn($a, $b) => ($a['name'] ?? '') <=> ($b['name'] ?? ''));
数字字段同理,避免隐式转换出错:
- 用
(int)($a['score'] ?? 0)强转再比较 - 不要用
$a['score'] - $b['score'],浮点数可能丢失精度 - 升序用
,降序就调换位置:($b['score'] ?? 0) ($a['score'] ?? 0)
多条件排序时箭头函数怎么写才清晰不翻车
多个 ?: 嵌套可读性差,容易漏括号或逻辑短路。推荐拆成三元链式,每层只管一个优先级:
usort($users, fn($a, $b) =>
($a['status'] <=> $b['status']) ?: // 先按 status 升序
($b['score'] <=> $a['score']) ?: // status 相同时,按 score 降序
($a['name'] <=> $b['name']) // score 也相同时,按 name 升序
);
注意:?: 是“左侧为 0 才执行右侧”,所以每段必须是 的整数结果;用 == 或 === 会破坏链式逻辑。
容易踩的坑:
- 混用
和减法(如$a['score'] - $b['score']),类型不一致导致?:判断失效 - 字段名拼错或大小写不一致(PHP 数组键区分大小写)
- 没处理 null 值,
null 'abc'返回 -1,但你可能期望它排最后
最麻烦的其实是嵌套结构排序,比如 $a['profile']['age'] —— 这时候建议提前用 array_map 提取扁平字段,或者封装个安全取值函数,别硬塞进箭头函数里堆逻辑。



















