Krsortの公式定義:
bool krsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
関数:キー名で配列を逆に並べ替えると、キー名が保持されます。
返品値:ソートが成功したかどうか。
注:キー名は同じままですが、要素の順序はキー名の逆の順序で配置されます。
例えば:
$array = [
'b' => 2,
'a' => 1,
'c' => 3,
];
krsort($array);
print_r($array);
出力:
Array
(
[c] => 3
[b] => 2
[a] => 1
)
ご覧のとおり、配列はキー名に従って逆順序で配置されます。
場合によっては、アレイを部分的にソートするか、ソート後に特定の要素の相対順序を保持する必要がありますが、 Krsortは常にキー名に従ってグローバルにソートされます。これにより、元の順序が完全に再配置されます。
さらに、キー名のタイプが標準化されていない場合(番号キーが文字列キーと混合されるなど)、 Krsortは予想どおりに動作しない場合があります。別のポイントは、配列に同じキー名がある場合(これは、キー名が一意であるため、PHPではまれです)、またはキー名が類似しているがまったく同じ文字列ではない場合、順序にも影響します。
ソート時に要素の順序を部分的に保存する必要がある場合は、最初に元の注文を保存してから、この順序に従って調整できます。
$array = [
'b' => 2,
'a' => 1,
'c' => 3,
];
// 元の注文を保存します
$originalKeys = array_keys($array);
// 行為 krsort 選別
krsort($array);
// 特定の順序を保持したい場合,元の順序で並べ替えます
uksort($array, function($key1, $key2) use ($originalKeys) {
$pos1 = array_search($key1, $originalKeys);
$pos2 = array_search($key2, $originalKeys);
return $pos1 - $pos2;
});
print_r($array);
上記の例では、最初にkrsortを使用してから、 uksortを使用して元の順序でキー名の順序を再調整して、部分的な並べ替えの要件を実現します。
Krsortのデフォルトの逆ソートに満足していない場合は、 uksortを使用してキー名ソートルールをカスタマイズできます。
$array = [
'b' => 2,
'a' => 1,
'c' => 3,
];
// 按键名逆序選別,連想配列構造を保持します
uksort($array, function($k1, $k2) {
return strcmp($k2, $k1); // 逆比較文字列
});
print_r($array);
これにより、選別動作を完全に制御できます。
ビジネスロジックに「注文」の要件が非常に高い場合、アレイ自体の順序付けによって引き起こされる注文損失を回避するために、オブジェクトや双方向リンクリストなどの順序とキー名をサポートする構造を使用することをお勧めします。
<?php
// アレイの例
$array = [
'b' => 2,
'a' => 1,
'c' => 3,
];
// プラン1:krsort + uksort元の注文を復元します
$originalKeys = array_keys($array);
krsort($array);
uksort($array, function($key1, $key2) use ($originalKeys) {
$pos1 = array_search($key1, $originalKeys);
$pos2 = array_search($key2, $originalKeys);
return $pos1 - $pos2;
});
print_r($array);
// プラン2:uksort自定义键名逆序選別
uksort($array, function($k1, $k2) {
return strcmp($k2, $k1);
});
print_r($array);
?>
Krsortは、キー名に基づいて逆の順序でソートされます。デフォルトでは、要素の順序が変更されますが、キー名は保持されます。
「失われた注文」は、通常、キー名ソートが元の注文をカバーするためです。
解決策は、元の注文を節約する補助操作を組み合わせるか、 UKSORTを使用してカスタムソートを実装することです。
複雑なシナリオでは、他のデータ構造を検討して、順次の問題を回避します。
上記の方法により、元の順序の偶発的な損失を避けるために、連想配列選別プロセスをより柔軟に制御できます。滑らかなコーディングをお祈りします!