<?php
$array = [
"b" => 2,
"a" => 1,
"c" => 3,
];
krsort($array);
print_r($array);
?>
运行后,输出结果:
Array
(
[c] => 3
[b] => 2
[a] => 1
)
这里,键名按字母从大到小排序,符合预期。
krsort() 按键名排序时会自动将键名视为字符串或整数,如果数组的键名类型混杂,排序结果可能不符合预期。
例如:
<?php
$array = [
2 => 'two',
"10" => 'ten',
1 => 'one',
];
krsort($array);
print_r($array);
?>
这时键名 10 是字符串但实际上是数字键,会被转为整数处理,可能导致排序顺序和预期不符。
krsort() 只对数组的第一层键名进行排序,如果是多维数组,内部子数组并不会被排序。
<?php
$array = [
"first" => ["b" => 2, "a" => 1],
"second" => ["d" => 4, "c" => 3],
];
krsort($array);
print_r($array);
?>
这里只会对 first 和 second 这两个一级键名排序,内部的 b, a, d, c 键名不会改变。
krsort() 只支持数组参数,如果传入非数组(如对象或字符串),函数不会起作用,甚至可能报错。
检查变量是否为数组
使用 is_array() 函数验证,避免误用。
if (!is_array($array)) {
echo "传入的变量不是数组,无法排序";
}
检查键名类型是否一致
查看键名是否全部为字符串或整数,避免混合导致排序异常。
foreach ($array as $key => $value) {
var_dump($key, gettype($key));
}
确认是否排序了预期层级
针对多维数组,需明确需要排序的是哪一层。
针对上述问题,给出几种解决思路:
若键名混杂,先统一键名类型:
<?php
$newArray = [];
foreach ($array as $key => $value) {
$newArray[(string)$key] = $value;
}
krsort($newArray);
print_r($newArray);
?>
这样避免了数字字符串混淆。
如果需要对子数组键名也排序,使用递归方法:
<?php
function recursive_krsort(&$array) {
if (!is_array($array)) return;
krsort($array);
foreach ($array as &$value) {
if (is_array($value)) {
recursive_krsort($value);
}
}
}
recursive_krsort($array);
print_r($array);
?>
<?php
if (is_array($array)) {
krsort($array);
} else {
echo "变量不是数组,无法排序。";
}
?>
更多关于 PHP krsort() 的详细说明和示例,可以访问官方文档:
<code>https://gitbox.net/manual/en/function.krsort.php</code>