usort()配合匿名函数是最直接的二维数组字段排序方式,需注意数值用减法、字符串用strcmp等函数,关联数组应选uasort(),大数据量多字段排序可用array_multisort()。

用 usort() 配合匿名函数是最直接的写法
PHP 没有内置的「按字段名排序二维数组」函数,usort() 是最常用也最可控的方式。它允许你自定义比较逻辑,适配任意字段(包括嵌套、空值、类型混合等场景)。
关键点在于:比较函数必须返回整数(负数/0/正数),不能只写 $a['age'] 这种布尔表达式——那会强制转成 0 或 1,导致排序错乱。
- 升序:返回
$a['field'] - $b['field'](数值)或strcmp($a['field'], $b['field'])(字符串) - 降序:把上面两者的顺序对调,比如
$b['field'] - $a['field'] - 字段不存在时建议用
??提供默认值,避免Notice
$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 从小到大排列</p>
字符串字段排序别忘了用 strcmp() 或 strnatcmp()
直接用减法 - 对字符串做运算会触发隐式转换(比如 'apple' - 'banana' 变成 0 - 0),结果全是 0,数组顺序不变甚至打乱。
-
strcmp($a['name'], $b['name']):标准字典序,区分大小写 -
strnatcmp($a['name'], $b['name']):自然排序,适合含数字的字符串(如'item2'排在'item10'前) - 不区分大小写?用
strcasecmp()或先strtolower()
错误示例:return $a['name'] - $b['name']; → 全是 0,白排。
要保持键名关联关系?用 uasort() 替代 usort()
usort() 会重置数组键为数字索引(0,1,2…),如果你的二维数组是用字符串键(比如 ID 作 key)构建的,且后续还要靠原 key 查找,就必须用 uasort()。
-
usort():只保值,丢键(适用于索引数组) -
uasort():保值 + 保键(适用于关联数组) - 函数签名和逻辑完全一样,只是函数名不同
$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' 键还在</p>
性能敏感或多次排序?考虑提前提取排序列 + array_multisort()
当数组很大(几千行以上)且需按多个字段排序(比如先按 status,再按 created_at),usort() 的每次回调都要重复取字段,有轻微开销。array_multisort() 可以一次性提取所有排序列,效率略高,写法也更声明式。
- 先用
array_column()提取字段列 - 传入多个列 + 排序方向常量(
SORT_ASC/SORT_DESC) - 注意:它会修改原数组,且要求所有列长度一致
$scores = array_column($data, 'score'); array_multisort($scores, SORT_DESC, $data); // 按 score 降序重排 $data
不过日常几百条数据,usort() 更直观,没必要过早优化。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











