在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系列已是稳定的,老版本不稳定。
如果你有具体场景(比如按对象属性、中文排序等),可以告诉我,我给你写一个精确的示例。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播