PHP数组排序你用哪个

wen PHP项目 5

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

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 系列已是稳定的,老版本不稳定。

如果你有具体场景(比如按对象属性、中文排序等),可以告诉我,我给你写一个精确的示例。

抱歉,评论功能暂时关闭!