PHP 没有内置的「按字段名排序二维数组」函数,usort() 是最常用也最可控的方式。它允许你自定义比较逻辑,适配任意字段(包括嵌套、空值、类型混合等场景)。
关键点在于:比较函数必须返回整数(负数/0/正数),不能只写 $a['age'] 这种布尔表达式——那会强制转成 0 或 1,导致排序错乱。
|
1 2 3 4 5 6 7 8 9 |
$data = [ ['name' => 'Alice', 'score' => 85], ['name' => 'Bob', 'score' => 92], ['name' => 'Charlie', 'score' => 78] ]; <p>usort($data, function($a, $b) { return $a['score'] - $b['score']; // 升序 }); // $data 现在按 score 从小到大排列 |
直接用减法 - 对字符串做运算会触发隐式转换(比如 'apple' - 'banana' 变成 0 - 0),结果全是 0,数组顺序不变甚至打乱。
错误示例:return $a['name'] - $b['name']; → 全是 0,白排。
usort() 会重置数组键为数字索引(0,1,2…),如果你的二维数组是用字符串键(比如 ID 作 key)构建的,且后续还要靠原 key 查找,就必须用 uasort()。
|
1 2 3 4 5 |
$data = [ 'user_101' => ['name' => 'Tom', 'level' => 3], 'user_205' => ['name' => 'Jane', 'level' => 1], ]; <p>uasort($data, fn($a, $b) => $b['level'] - $a['level']); // 降序,且 'user_101' 键还在 |
当数组很大(几千行以上)且需按多个字段排序(比如先按 status,再按 created_at),usort() 的每次回调都要重复取字段,有轻微开销。array_multisort() 可以一次性提取所有排序列,效率略高,写法也更声明式。
|
1 2 |
$scores = array_column($data, 'score'); array_multisort($scores, SORT_DESC, $data); // 按 score 降序重排 $data |
不过日常几百条数据,usort() 更直观,没必要过早优化。