PHP中使用usort排序关联数组时保留键名的问题
解决关联数组排序后键名丢失的问题
这个问题我之前也踩过坑!usort()函数的设计就是针对索引数组排序的,它会直接重置数组的键为数字序列,所以你的字符串键名key_a、key_b这些自然就没了。要保留关联数组的键名,你需要用uasort()——它和usort()的用法几乎一致,但会维持原有的键值对应关系。
完整解决方案代码
// 你的原数组 $materials = [ "key_a" => ["avg" => 2], "key_b" => ["avg" => 3], "key_c" => ["avg" => 0] ]; // 使用uasort替代usort,保留键名 uasort($materials, function($a, $b) { // 按avg值降序排序 if ($a["avg"] == $b["avg"]) { return 0; } return ($a["avg"] < $b["avg"]) ? 1 : -1; }); // 输出结果 print_r($materials);
简化版(PHP 7+ 可用)
如果你的PHP版本是7及以上,可以用太空船运算符<=>简化回调逻辑,代码更简洁:
uasort($materials, function($a, $b) { return $b["avg"] <=> $a["avg"]; // 降序排序,交换a和b的位置就是升序 });
输出结果
执行后你会得到期望的保留键名的排序结果:
Array ( [key_b] => Array ( [avg] => 3 ) [key_a] => Array ( [avg] => 2 ) [key_c] => Array ( [avg] => 0 ) )
简单总结下:
usort():排序索引数组,重置键名uasort():排序关联数组,保留键名uksort():如果是要按键名排序,用这个函数
内容的提问来源于stack exchange,提问作者Timmy




