<?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>