关联数组按值排序必须用asort()或arsort(),sort()会丢失字符串键名;多维数组需usort()或uasort();array_multisort()多条件排序须传引用且列与方向严格对应。
别一上来就写—— 它会直接抹掉所有字符串键名,后续用就是错误。
关联数组按值排序必须用
或
你有个用户数据:
,想按分数排但还要知道谁对应多少分。
会把它变成
,
消失了。
才是正解:
后,
里
还是
、
默认按字符串比较,
会成立;要数值比较得加
:
中文键或值排序乱?系统 locale 没设对,
再加
多维数组按某个字段排序得用
或
比如订单列表:
,
和
都没法处理这种结构。
要重置数字索引(比如后续用
),用
要保留原始键名(如
),改用
回调函数里别改
或
,否则 PHP 会报
空字段或缺失键会引发 notice,先做
防御
多条件排序容易静默失败
想先按
升序,再按
降序?
写起来啰嗦,
更直白,但陷阱明显:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
所有列数组都必须传引用:
中的
和
都得是
、
,漏一个引用,排序就完全不生效,也不报错
必须在调用前执行,不能直接塞
到参数里
方向标志
/
必须和列一一对应,顺序错一个,结果就错
万级数据时比
略快,但小数组没必要硬上,可读性反而差
最常被忽略的是:所有内置排序函数(
、
、
等)都是原地修改,不返回新数组;且当数组元素少于 2 个时,
类函数根本不会调用你的比较函数——这点在单元测试或空数据分支里极易漏测。
sort()$arr['name']undefined indexasort()arsort()$scores = ['alice' => 87, 'bob' => 92, 'carol' => 76]sort()[0 => 76, 1 => 87, 2 => 92]'alice'asort()asort($scores)foreach ($scores as $name => $score)$name'alice''bob'100 < 20SORT_NUMERICasort($scores, SORT_NUMERIC)setlocale(LC_COLLATE, 'zh_CN.UTF-8')SORT_LOCALE_STRINGusort()uasort()$orders = [['id'=>1, 'status'=>'shipped', 'at'=>'2024-05-10'], ['id'=>2, 'status'=>'pending', 'at'=>'2024-05-11']]sort()asort()$orders[0]usort($orders, fn($a, $b) => strtotime($a['at']) <=> strtotime($b['at']))$orders['ORD-001']uasort()$a$bArray was modified by the user comparison function$a['at'] ?? '1970-01-01'array_multisort()statuscreated_atusort()array_multisort()array_multisort($status, SORT_ASC, $created, SORT_DESC, $data)$status$created&$status&$created$status = array_column($data, 'status')array_column($data, 'status')SORT_ASCSORT_DESCusort()sort()asort()usort()usort()