ThinkPHP7不提供独立数组排序函数,依赖PHP原生排序(如asort、usort)处理内存数组,而数据库排序通过order()生成SQL ORDER BY由MySQL执行;二维数组需用usort或array_multisort;Arr::sort()不存在;动态排序字段必须白名单校验防SQL注入。

ThinkPHP7本身不提供独立的数组排序函数,它完全依赖PHP原生排序能力,但通过框架层封装和数据库查询构建器,把排序行为拆解到不同层级——PHP处理内存中已存在的数组,ThinkPHP7则主导数据库结果集的有序获取与结构化转换。
PHP原生数组排序直接操作内存数据
调用asort()、usort()等函数时,PHP直接对当前脚本内存里的数组变量进行重排,不涉及SQL、不触发数据库交互,排序结果立即生效且不可逆。
这一步操作起来很简单,直接传入数组变量即可:asort($data)。
注意:如果数组是二维的(比如数据库查出的多条记录),asort()只按第一维的值比较,无法识别['name' => 'a', 'score' => 85]这类结构;此时必须用usort()配合匿名函数,否则排序结果会错乱。
立即学习“PHP免费学习笔记(深入)”;
ThinkPHP7的“排序”本质是SQL ORDER BY的声明式控制
ThinkPHP7中写->order('create_time desc'),不是在PHP里排数组,而是往SQL语句末尾拼ORDER BY create_time DESC,真正排序由MySQL执行。
第一步:调用order()方法设置排序规则;
第二步:执行select()或paginate()时才真正发起带ORDER BY的查询;
第三步:数据库返回已排序的结果集,TP7再转成PHP数组。
【order()必须在paginate()之前调用,否则分页会覆盖你的排序】。这是最常踩的坑——很多人先调paginate(10)再补order(),结果页面还是按ID升序。
ThinkPHP7对多维数组排序需手动桥接
当从数据库查出二维数组(如用户列表)后想在PHP层二次排序,TP7不干预也不封装,你得自己用PHP函数处理。
方法一:用array_multisort()按指定字段批量排序
提取列值:$scores = array_column($users, 'score'); → 调用array_multisort($scores, SORT_DESC, $users);
方法二:用usort()写灵活逻辑
比如按姓名拼音首字母排序:usort($users, function($a, $b) { return strcmp(substr($a['name'], 0, 1), substr($b['name'], 0, 1)); });
TP7的Arr::sort()并不存在——官方未提供该静态方法,任何文档里出现的都是误传或第三方扩展,别被误导。
安全边界:字段名白名单是ThinkPHP7强制要求
用户能控制排序字段(如URL参数?sort=name&order=desc)时,PHP原生函数无此顾虑,但TP7必须校验:
定义白名单:$allowFields = ['name', 'score', 'create_time'];
过滤输入:$field = in_array($request->param('sort'), $allowFields) ? $request->param('sort') : 'id';
【不校验就直接拼进order(),等于把SQL注入入口敞开】。例如传入sort=id, (SELECT password FROM users LIMIT 1),字符串拼接模式下会直接执行子查询。



















