php 7.3 中最常用、最灵活的多维数组字段排序方式是 usort() 配合匿名函数,支持单/多字段升序降序、字符串不区分大小写、null 安全处理及中文排序,可封装为通用函数。

PHP 7.3 中对数组按指定字段排序,最常用、最灵活的方式是使用 usort() 配合匿名函数(闭包),结合 strcmp()(字符串)或直接比较(数字)来实现多维数组的字段级排序。
按单个字段升序/降序排序
针对含关联键的二维数组(如用户列表),按某个键(如 'age' 或 'name')排序:
- 升序:在比较函数中返回
$a['field'] $b['field'](太空船操作符,PHP 7+ 支持) - 降序:交换顺序,写成
$b['field'] $a['field'] - 字符串字段建议用
strcasecmp($a['name'], $b['name'])实现不区分大小写的升序
示例:
$users = [
['name' => 'Alice', 'age' => 32],
['name' => 'bob', 'age' => 25],
['name' => 'Charlie','age' => 29]
];
<p>usort($users, function($a, $b) {
return $a['age'] $b['age']; // 按 age 升序
});
// 结果:bob(25), Charlie(29), Alice(32)</p>按多个字段组合排序(主次分明)
先按字段 A 排序,相同时再按字段 B 排序,只需在比较函数中分层判断:
- 先比较主字段,不等则直接返回结果
- 相等时再比较次字段,避免重复计算
- 可嵌套多层,逻辑清晰易维护
示例(先按 status 分组('active' > 'pending' > 'inactive'),再按 created_at 倒序):
usort($items, function($a, $b) {
// 自定义状态优先级
$statusWeight = ['active' => 3, 'pending' => 2, 'inactive' => 1];
$wA = $statusWeight[$a['status']] ?? 0;
$wB = $statusWeight[$b['status']] ?? 0;
<pre class="brush:php;toolbar:false;">if ($wA !== $wB) {
return $wB $wA; // active 优先,降序排权重
}
return $b['created_at'] $a['created_at']; // 时间新在前});
封装成可复用函数(支持键名、方向、类型)
为减少重复代码,可封装一个通用排序函数,接受数组、字段名、排序方向('asc'/'desc')和类型('string'/'number'):
- 用
array_column()提取字段值,配合array_multisort()是另一种方案,但对关联键数组需额外处理索引 -
usort()更直观可控,尤其适合含逻辑判断或混合类型场景 - 注意:排序会修改原数组,如需保留原始顺序,应先
$sorted = $arr;赋值副本
简易封装示例:
function array_sort_by_field(&$arr, $field, $direction = 'asc', $type = 'string') {
$dir = strtolower($direction) === 'desc' ? -1 : 1;
usort($arr, function($a, $b) use ($field, $dir, $type) {
$valA = $a[$field] ?? null;
$valB = $b[$field] ?? null;
<pre class="brush:php;toolbar:false;"> if ($type === 'number') {
return ($valA $valB) * $dir;
}
return (strcasecmp((string)$valA, (string)$valB)) * $dir;
});}
注意事项与避坑点
实际开发中容易忽略的细节:
- 字段可能不存在 → 使用
$a[$field] ?? null避免 Notice - NULL 值参与比较时,
返回 0(视为相等),如需 NULL 排最后,可单独判断:if ($a[$f] === null) return 1; if ($b[$f] === null) return -1; - 中文字符串排序需用
mb_strcasecmp()并确保内部编码一致(如 UTF-8) - PHP 7.3 已废弃
create_function(),务必用匿名函数替代
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











