PHP怎样对数组变量进行排序_PHP数组变量排序操作【排序】

6次阅读

php数组排序函数选择取决于需求:sort重排值并丢键,asort保留键值关系按值排序,ksort按键名排序;三者均原地修改且返回布尔值。

PHP怎样对数组变量进行排序_PHP数组变量排序操作【排序】

PHP 数组排序函数选哪个?sortasortksort 区别在哪

看需求定:要重排值且丢掉原键用 sort;要保留键值对应关系用 asort;要按键名排序用 ksort。三者都直接修改原数组,不返回新数组——这是最容易错的地方。

常见错误现象:print_r(sort($arr)) 打印出 1,因为 sort 返回布尔值,不是排序后的数组。

  • sort($arr):索引数组常用,排序后键变成 0,1,2…,原键名丢失
  • asort($arr)关联数组首选,值升序,键跟着动,['b'=>2, 'a'=>1]['a'=>1, 'b'=>2]
  • ksort($arr):按键名字符串升序,['z'=>1, 'a'=>2]['a'=>2, 'z'=>1]
  • 所有函数默认按字符串规则比较,数字会被转成字符串排(10 成立),要按数值排得加 <code>SORT_NUMERIC 标志

怎么按数组内某个字段排序?比如用户数组按 age 升序

PHP 没有内置“按子键排序”,得靠 usort 配自定义比较函数。核心是:比较函数返回负数、0、正数,分别代表“小-等-大”。

容易踩的坑:忘记 return,或写成 $a['age'] > $b['age'](返回布尔值,不是整数),导致排序乱序。

立即学习PHP免费学习笔记(深入)”;

  • 必须用 usort($users, function($a, $b) { return $a['age'] $b['age']; }),飞船操作符 是安全写法
  • 如果 PHP 版本低于 7,改用 return $a['age'] - $b['age'](仅限整数)或 return strcmp($a['name'], $b['name'])(字符串)
  • usort 会重置键名,如需保留原键,用 uasort
  • 性能上,usortarray_multisort 更直观,但大数据量时后者略快(不过多数场景无感)

中文字符串排序乱码?sort 不支持 UTF-8

直接用 sort 排中文,结果是按字节序,不是按拼音或 Unicode 码点,所以“张”可能排在“啊”前面。

根本原因是 PHP 默认排序函数不走 locale,也不识别 UTF-8 编码边界。

  • 临时方案:用 Collator 类(ICU 扩展需开启),$coll = new Collator('zh_CN'); $coll->asort($arr)
  • 没扩展?转拼音再排:用第三方库(如 overtrue/pinyin)先把中文转成拼音字符串,再按拼音排序
  • 别用 setlocale(LC_COLLATE, 'zh_CN.UTF-8') + strcollusort,不同系统 locale 名不一致,线上环境极易失效
  • 注意:Collator 的排序结果和微信/excel 不完全一致,因底层规则不同,别硬对齐

多维数组排序后丢失结构?array_multisort 怎么用才不翻车

array_multisort 功能强但参数顺序反直觉:第一个参数是“排序依据列”,但它本身会被修改;后续参数才是被排序的数组。

典型翻车现场:array_multisort($ages, SORT_ASC, $users) —— 表面上想按 $ages$users,但如果 $ages$users 键不一致或长度不同,$users 可能被截断或补空。

  • 确保用于排序的列(如 $ages)和目标数组(如 $users)键完全一致、数量相同
  • 推荐先提取列:$ages = array_column($users, 'age');,再调用 array_multisort($ages, SORT_ASC, $users)
  • 可链式多条件:array_multisort($ages, SORT_DESC, $names, SORT_ASC, $users),优先级从左到右
  • 它不支持闭包或复杂逻辑,真要按动态字段或表达式排序,老实用 usort

实际项目里,90% 的排序需求用对三个函数就覆盖了:简单值排用 sort/asort,按字段排用 usort,多列协同排用 array_multisort。中文排序和 locale 问题最容易在线上突然暴露,别等上线才发现。

text=ZqhQzanResources