直接用 sort($scores, sort_numeric) 升序排列纯数字成绩数组,原地修改且按数值比较;保键名用 asort(),降序用 rsort() 或 arsort();复杂排序用 usort() 配回调函数。

用 sort() 直接升序排成绩数组
如果成绩存的是纯数字,比如 $scores = [85, 92, 76, 99, 88];,直接调 sort() 最快。它会原地修改数组,按数值大小升序排列,注意它**不是按字符串规则比**,所以不会出现 100 排在 95 前面这种错乱。
常见错误:传入关联数组后发现键名全丢了——sort() 只保留值,重排索引。要保键名得用 asort()。
- 升序排数值:
sort($scores, SORT_NUMERIC);(显式加标志更稳妥) - 别对字符串型数字用默认模式,比如
['100', '95']会当字符串比,结果反直觉 - 排序后原数组改变,不需要赋值回变量
按降序排或保留原始键名用 rsort() 和 asort()
老师常要“从高到低列成绩榜”,这时用 rsort();如果成绩数组带学生ID作键(如 ['s001' => 85, 's002' => 92]),必须用 asort() 或 arsort(),否则键和分数就对不上了。
参数差异很关键:SORT_NUMERIC 强制按数比较,SORT_STRING 按字典序,混用会出 bug。比如 asort($scores, SORT_NUMERIC) 才能正确处理 ['s001' => '95', 's002' => '100'] 这种字符串值。
- 降序且丢键名:
rsort($scores, SORT_NUMERIC); - 升序且保键名:
asort($scores, SORT_NUMERIC); - 降序且保键名:
arsort($scores, SORT_NUMERIC); - 别漏
SORT_NUMERIC,尤其数据来源是表单或 CSV 时,值大概率是字符串
自定义排序逻辑:比如先按分数再按姓名
单纯排数字不够用——比如两个学生同分,得按姓名拼音排。这时候必须用 usort() 配匿名函数。它不关心键名,只按值排序,适合索引数组;若需保键名,改用 uasort()。
性能上,usort() 比内置函数慢一点,但复杂规则下没别的选择。注意函数里必须返回整数:负数表示前者小、正数表示前者大、0 表示相等。
- 同分时按姓名升序:
usort($students, function($a, $b) { return $a['score'] $b['score'] ?: strcmp($a['name'], $b['name']); }); - 避免在回调里做耗时操作(如查数据库),否则排序变慢
-
是太空船操作符,PHP 7+ 支持,安全比较数字/字符串
排序后想取前3名或过滤不及格?别重复遍历
排序只是手段,真正需求常是“最高分三人”或“列出所有及格者”。别排完再用 foreach 数前三个——直接用 array_slice();也别排完再 array_filter() 筛,那样做了两次遍历。
兼容性要注意:array_slice($scores, 0, 3) 在 PHP 5.6+ 没问题,但老版本不支持负偏移取末尾;如果要“最后三名”,写成 array_slice($scores, -3) 更简洁。
- 取前三:
$top3 = array_slice($scores, 0, 3); - 取不及格者(假设60分及格):
$failures = array_filter($scores, function($s) { return $s (这个不用先排序) - 如果既要前3又要保原始结构(如含学生信息),排序必须用
usort()处理完整记录,不能只排分数再映射
sort() 默认当字符串比。加 SORT_NUMERIC 不是可选项,是必选项。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











