选对php排序函数需据数组类型和键名需求:索引数组用sort(),关联数组按值排用asort(),按子键排用uasort(),多字段排用array_multisort();usort()重置键,uasort()保留键;自定义比较须返回整数并处理缺失键。

sort() 会丢键,asort() 保留键但只适用于简单值,真要按某个字段排序二维数组,必须用 usort()、uasort() 或 array_multisort() ——选错函数,轻则键名消失,重则排序结果错乱。
怎么选对排序函数:看数组类型和是否要留键名
PHP 排序函数不是“哪个好用选哪个”,而是“哪个匹配你的数组结构”。关键就两点:是不是关联数组?需不需要原始键名?
- 索引数组(纯数字键)+ 不care键名 → 用
sort()或rsort() - 关联数组(字符串键)+ 按值排 + 要保留
'user_id' => 123这种映射 → 用asort()或arsort() - 关联数组 + 按某个子键(如
$arr['user1']['score'])排 → 不能用asort(),它不理解嵌套,得上uasort() - 二维数组 + 需要多字段排序(比如先按
status升序,再按created_at降序)→array_multisort()更稳,usort()容易写崩
usort() 和 uasort() 的区别不只是“多一个 a”
表面看只差一个字母,实际行为差异直接影响数据访问逻辑。
-
usort()强制重置为[0] => ..., [1] => ...,适合你后续只用foreach遍历、不靠键名取值的场景 -
uasort()保持原键名不变,比如['order_123' => [...], 'order_456' => [...]]排完还是这两个键,方便你之后写$orders['order_123']直接取 - 两者都要求比较函数返回整数:负数($a 小)、0(相等)、正数($a 大)。写成
return $a['price'] > $b['price']是错的——那只会返回布尔值,PHP 会转成 0 或 1,导致全乱序 - 如果目标键可能不存在(比如某条记录缺
'score'),直接$a['score']会触发Notice。得用空合并:$a['score'] ?? 0
array_multisort() 提取列排序时的三个坑
它比 usort() 更“笨但可靠”,但用不好容易报 warning 或排错。
-
array_column($data, 'name')遇到某行没'name'键,返回NULL,而array_multisort()对NULL的排序行为不一致(PHP 7 vs 8 表现不同),建议提前过滤:$data = array_filter($data, fn($x) => isset($x['name'])); - 所有传入
array_multisort()的列数组长度必须和原数组一致。少一个元素,PHP 可能静默截断或报Warning: array_multisort(): Array sizes are inconsistent - 升序用
SORT_ASC,降序用SORT_DESC,但它们必须紧跟在对应列参数后面,顺序错位(比如把SORT_DESC放最后)会导致整个排序失效,且无提示 - 示例正确写法:
array_multisort($scores, SORT_DESC, $names, SORT_ASC, $data);—— 别漏掉中间的$names,也别把SORT_ASC挪到$data后面
自定义排序函数封装时最常被忽略的一点
很多人封装 sortByKey($arr, $key, $dir) 时只处理了字符串键,忘了 PHP 关联数组的键可以是整数(比如 [100 => [...], 200 => [...]]),而 uasort() 对这种数组依然有效,但 array_multisort() 在提取列时若原数组键是数字,array_column() 仍能正常工作——关键是别在封装里硬加 is_string(key) 判断,那会砍掉合法用法。
真正该加的是类型兜底:如果目标字段是字符串但你要数值排序(比如 '10' 和 '2'),不显式 (int) 或 intval(),PHP 字符串比较会按字典序得出错误结果。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











