<?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);
?>
ここでは、最初と2番目の第1レベルのキー名のみを並べ替え、 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>