array_multisort 更快更简洁,适合规则明确的字段排序;usort 更灵活但慢且易错,仅在逻辑复杂时使用。

直接说结论:array_multisort 更快、更简洁,适合按字段升/降序这种规则明确的排序;usort 更灵活,但慢、易写错,只在逻辑复杂时才值得用。
按单个字段排序,优先用 array_multisort + array_column
这是最常见也最推荐的写法。不用写回调函数,不涉及比较逻辑,性能好,代码干净。
-
array_column($data, 'age')提取所有age值,生成一维数组 -
array_multisort($ages, SORT_ASC, $data)用提取出的值驱动原数组重排 - 支持
SORT_NUMERIC/SORT_STRING等标志,比如时间字符串要加SORT_STRING,否则可能按字典序错排 - PHP 7.4+ 支持直接传
array_column($data, 'created_at')作为第一个参数,无需中间变量
需要多字段组合排序时,array_multisort 依然更稳
比如“先按 status 升序,再按 updated_at 降序”,array_multisort 天然支持,而 usort 回调里容易漏掉相等情况的处理。
- 写法是:
array_multisort(array_column($data, 'status'), SORT_ASC, array_column($data, 'updated_at'), SORT_DESC, $data) - 注意:所有列数组长度必须和
$data一致,否则会静默截断或报Warning: array_multisort(): Array sizes are inconsistent - 如果某个字段是对象属性(如
$item->score),得先用array_map提取,不能直接array_column
usort 只在这些情况才必要
它不是“更高级”,而是“不得已”。一旦用了,就得自己扛住所有边界问题。
- 字段值类型混杂(比如有的
price是null、空字符串、数字),array_multisort会崩或排错,usort可以手动is_numeric()判断 - 要按中文姓名拼音首字母排序,得调
mb_substr+iconv('UTF-8', 'GBK//IGNORE', ...),没法塞进array_column - 排序逻辑依赖外部状态(比如当前用户权限影响可见性权重),回调里可以闭包捕获变量
- 注意:
usort的比较函数必须返回整数:小于返回负数、等于返回 0、大于返回正数;写成return $a['x'] > $b['x'] ? 1 : -1会把相等当成“大于”,导致顺序错乱
性能差距明显,数据量一大就露馅
实测 10 万条数据按字段排序,array_multisort 耗时约 0.005 秒,usort 约 0.022 秒 —— 差了 4 倍以上。这不是理论值,是真实 CPU 时间。
- 根本原因:
array_multisort是 C 实现的底层排序,且只做一次索引映射;usort是 PHP 层回调,每次比较都要进出 Zend VM - 如果你在循环里反复调用排序(比如分页查完再排),
usort很容易成为瓶颈 - PHP 8.0+ 对
usort有优化,但依然追不上array_multisort
真正容易被忽略的点是:很多人以为 array_multisort 只能用于“多个数组”,其实它对单个二维数组的字段排序才是主力场景;而 usort 回调里那个三值返回规则,90% 的线上 bug 都出在这儿。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











