uksort 是按键名排序且保持键值对关联的函数,回调必须返回整数,类中调用需正确绑定方法,不能用于按值字段排序,应改用 uasort。

uksort 本质是「按键名排序,但不走默认字典序,而是由你写逻辑决定谁在前谁在后」——它只关心键(key),不碰值(value),且一定保持键值对的原始关联。
uksort 的回调函数必须返回整数
常见错误是返回浮点数、字符串或布尔值,比如 return $a > $b(返回 true/false)或 return strcmp($a, $b) / 10(返回小数)。PHP 内部会把非整数强制转成 int,0.99 和 0.1 都变 0,导致大量键被判定“相等”,排序结果错乱。
- 正确写法:用三元运算符或减法确保整数,如
return $a $b(PHP 7+)或return strcmp($a, $b) - 字符串忽略大小写比较:用
strcasecmp($a, $b),别用strtolower()+strcmp()多余开销 - 如果键是数字字符串(如
"10","2"),想按数值排?得先(int)$a转型,否则还是字典序
uksort 在类中调用时 callback 写法容易错
直接传函数名字符串(如 "mySort")只在全局作用域有效;类方法必须显式绑定实例,否则报 Warning: uksort() expects parameter 2 to be a valid callback。
- 静态方法:用
[self::class, 'methodName']或['ClassName', 'methodName'] - 实例方法:用
[$this, 'methodName'] - 推荐闭包:直接
function($a, $b) use ($someVar) { ... },避免作用域和生命周期问题
uksort 不适合直接处理多维数组的子字段
有人误以为 uksort($arr, function($a, $b) { return $a['name'] $b['name']; }) 能按值里的字段排键——这是错的。$a 和 $b 是键名本身(比如 "user_123"、"post_456"),不是对应值。要按值排序,该用 uasort();要按键里嵌套结构排序(如键是 JSON 字符串),得先解析再比,但性能和可读性都差。
立即学习“PHP免费学习笔记(深入)”;
- 典型误用场景:关联数组键为 ID,值为对象,想按对象的
created_at排序 → 改用uasort() - 真需要按键“内容”排:比如键是
"img_2023-01-01.jpg",想按日期提取后排序 → 先preg_match()提取日期部分再比 - 注意 PHP 8.0+ 的稳定性:相等键会保持原顺序;老版本(
最常被忽略的一点:uksort 不改变数组值,只重排键的顺序,但内部指针会被重置到第一个元素——如果你刚用 next() 或 current() 遍历过,排序后得重新 reset() 或用 foreach 安全遍历。



















