PHP排序关键在于先识别前端传入数组结构再选函数:一维数组据类型用sort/SORT_NUMERIC或asort;二维数组优先array_multisort+array_column,多字段或需保留键名则用uasort并处理缺失字段。

$_GET、$_POST 或 JSON body(json_decode(file_get_contents('php://input'), true))进来的,它可能是一维、二维、带键名、含空值,甚至字段类型混杂。选错函数,排序就乱序或报错。
怎么判断前端传来的数组结构
别急着调用 sort()。先 var_dump($_POST) 或 print_r($data) 看清结构:
- 如果是
$_POST['ids'] = ['3', '1', '2']→ 一维索引数组,数字字符串,适合sort($arr, SORT_NUMERIC) - 如果是
$_POST['users'] = [['name'=>'a','age'=>'25'], ['name'=>'b','age'=>'22']]→ 二维关联数组,必须用array_multisort()或usort() - 如果前端用
FormData提交带重复键(如item[]=1&item[]=3),PHP 自动转成索引数组,但值可能是字符串,需注意类型 - 若字段含
null、空字符串、缺失键(如某些行没score),usort()里不加isset()或空合并会触发 notice 或逻辑错
一维数组排序:别默认用 sort(),看类型再定
sort() 默认按字符串比较:['10', '2', '1'] 排成 ['1', '10', '2'] ——这不是你要的数字序。
- 数值型字符串 → 加
SORT_NUMERIC:sort($arr, SORT_NUMERIC) - 纯字母或需忽略大小写 → 用
natcasesort($arr)(自然排序 + 不区分大小写) - 要保留原始键名(比如前端传了
['user_101' => 85, 'user_203' => 92])→ 改用asort($arr, SORT_NUMERIC),否则sort()会把键全改成0,1,2... - 前端传的是 JSON 字符串(如
{"list":[...]}),必须先json_decode($json, true),否则直接对字符串调sort()会报错
二维数组按字段排序:优先用 array_multisort() + array_column()
这是最稳、性能较好、且不重置键名的方式,适用于已知字段名、单字段主排序的场景。
- 升序排
age:array_multisort(array_column($users, 'age'), SORT_ASC, $users) - 降序排
name:array_multisort(array_column($users, 'name'), SORT_DESC, $users) - 注意:
array_column()在 PHP 5.5+ 才有;若字段可能为null,array_column()会返回null值,array_multisort()会把它们排在最前(升序)或最后(降序),如需自定义空值位置,得切到usort() - 多字段排序(如先按
status升序,再按created_at降序)→array_multisort()可链式传多个列数组和方向,但顺序必须严格对应
需要自定义逻辑?用 usort() 或 uasort(),但注意副作用
usort() 简单直接,但会把原数组的数字键重置为 0,1,2...;如果你的二维数组是用字符串作键(如 ['order_123' => [...], 'order_456' => [...]]),必须改用 uasort() 才能保留这些键名。
立即学习“PHP免费学习笔记(深入)”;
- 安全写法(防缺失字段):
uasort($data, function($a, $b) { $a_score = $a['score'] ?? 0; $b_score = $b['score'] ?? 0; return $b_score $a_score; }); - 字符串字段降序(注意大小写):
return strcasecmp($b['name'], $a['name']); - PHP 7.0+ 推荐用 (宇航员飞船操作符),比
strcmp()或减法更安全,自动处理类型转换 - 别在比较函数里做耗时操作(如查数据库、调 API),
usort()内部会多次调用该函数,O(n log n) 次



















