在PHP中,数组排序主要看场景和是否需要保持键值关联,我常用的有这几个:

最常用:sort() / rsort()
- 用途:对值升序/降序排序,重新索引(键变为0、1、2…)
- 适用:不关心键,只要排好序的列表
$nums = [3, 1, 2]; sort($nums); // [1, 2, 3] rsort($nums); // [3, 2, 1]
保留键名:asort() / arsort()
- 用途:按值排序,但保留键值关联
- 适用:关联数组,排序后还要用原键
$ages = ['Tom'=>25, 'Amy'=>30, 'Bob'=>20]; asort($ages); // Bob=20, Tom=25, Amy=30 (键保留) arsort($ages); // Amy=30, Tom=25, Bob=20
按键排序:ksort() / krsort()
- 用途:按键升序/降序
- 适用:需要按键排序的关联数组
$data = ['b'=>1, 'a'=>2]; ksort($data); // ['a'=>2, 'b'=>1]
自定义规则:usort() / uasort() / uksort()
- 用途:用回调函数自定义比较逻辑
- 适用:按年龄、字符串长度、嵌套数组字段等复杂排序
// 按字符串长度升序 $words = ['apple', 'kiwi', 'pear']; usort($words, fn($a, $b) => strlen($a) <=> strlen($b)); // ['pear'(4), 'kiwi'(4), 'apple'(5)]
// 保留键,按嵌套数组的 score 字段排序 $users = [ ['name'=>'Tom', 'score'=>85], ['name'=>'Amy', 'score'=>92], ]; uasort($users, fn($a, $b) => $b['score'] <=> $a['score']);
---
### 5. 多维/多字段排序:`array_multisort()`
- **用途**:一次对多个数组或多维数组排序(类似SQL ORDER BY)
- **适用**:按多个列排序
```php
$users = [
['name'=>'Tom', 'age'=>25, 'score'=>80],
['name'=>'Amy', 'age'=>30, 'score'=>90],
['name'=>'Bob', 'age'=>25, 'score'=>95],
];
// 先按 age 升序,再按 score 降序
array_multisort(
array_column($users, 'age'), SORT_ASC,
array_column($users, 'score'), SORT_DESC,
$users
);
高级技巧:排序并保留原始下标+自定义规则(uasort + array_multisort 结合)
如果既要自定义规则,又要多重排序,可以先 array_multisort 提取列后用 uasort。
选哪个?
| 需求 | 函数 |
|---|---|
| 简单值排序,不需要键 | sort() / rsort() |
| 关联数组按值排序,保留键 | asort() / arsort() |
| 按键排序 | ksort() / krsort() |
| 自定义规则(值) | usort() / uasort() |
| 自定义规则(键) | uksort() |
| 多字段排序(类似SQL) | array_multisort() |
| 排序后需要原始索引 | uasort()(保留键)或 asort() |
额外提醒(很常见坑):
sort()/usort()会重新索引,如果你用关联数组会丢键 → 此时用asort()/uasort()- 如果需要稳定排序(相等元素保持原顺序),PHP 8.0+ 的
sort系列已是稳定的,老版本不稳定。
如果你有具体场景(比如按对象属性、中文排序等),可以告诉我,我给你写一个精确的示例。