PHPでは、アレイのソート、特に連想配列(キー値ペア配列)の並べ替えの場合、重複するキー名に遭遇するか、ソートが期待を満たしていないことがよくあります。 Krsortは、キー名による逆ソートのPHPの関数です。 「重要な複製がソートにつながる」という問題を解決できますか?この記事では、詳細に分析し、特定の操作例を示します。
まず、PHPアレイのキー名が一意であることは明らかです。値を配列に割り当てるときに重複キー名を使用する場合、その後割り当てられた値は前の値を上書きします。例えば:
<?php
$arr = [
"key1" => "value1",
"key2" => "value2",
"key1" => "value3"
];
print_r($arr);
?>
出力の結果は次のとおりです。
Array
(
[key1] => value3
[key2] => value2
)
Key1が繰り返されると、 Value1はValue3によって上書きされ、実際には最後の割り当てのみが配列に保持されることがわかります。
したがって、 PHPアレイにキー名を複製することは不可能です。つまり、キー名の重複に問題があると感じた場合、アレイ構造を誤って理解しているか、多次元配列または何らかのネストされた構造を使用している可能性があります。
KRSORT関数は、配列のキー名に従ってソート(下降)を逆にするために使用され、キー価値の関係を維持します。関数定義は次のとおりです。
bool krsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
例:
<?php
$arr = [
"b" => 2,
"a" => 1,
"c" => 3
];
krsort($arr);
print_r($arr);
?>
出力結果:
Array
(
[c] => 3
[b] => 2
[a] => 1
)
Krsortはキーの独自性に影響を与えないことに注意してください。既存のキーを単純に逆転させることに注意してください。
PHPアレイキー名のユニークな機能のため、いわゆる「主要な複製によって引き起こされる並べ替えの問題」は以下を指す場合があります。
多次元配列の異なるレベルのキー名は繰り返されますが、同じレベルでは一意です。
フィールドでソートしたいのですが、キー名は一意ではないか、データ構造が不合理です。
次のような多次元配列がある場合:
<?php
$arr = [
["id" => 1, "name" => "Alice"],
["id" => 2, "name" => "Bob"],
["id" => 1, "name" => "Charlie"]
];
ここには「ID」の重複がありますが、それはキー名ではなく、配列の値です。 「ID」フィールドを並べ替えたい:
<?php
// によるとid逆の順序で並べ替えます
usort($arr, function($a, $b){
return $b['id'] <=> $a['id'];
});
print_r($arr);
?>
これはKrsortとは何の関係もありません。Krsortはキー名に対してのみソートされます。
キー名の重複を避けるためにキーとしてフィールドを使用する必要がある場合は、最初にキー名をフィルタリングまたはスプライスできます。
<?php
$arr = [
["id" => 1, "name" => "Alice"],
["id" => 2, "name" => "Bob"],
["id" => 1, "name" => "Charlie"]
];
// によるidそしてnameユニークなキーとしての組み合わせ
$newArr = [];
foreach ($arr as $item) {
$key = $item['id'] . '_' . $item['name']; // 保証されたキーユニーク
$newArr[$key] = $item;
}
// 对键逆の順序で並べ替えます
krsort($newArr);
print_r($newArr);
?>
このようにして、キー名の重複を避けるだけでなく、 Krsortで並べ替えることもできます。
PHPアレイのキー名は一意でなければならず、実際の「キー名の複製」はありません。
Krsortは、キー名でソートを逆転させるために使用され、キー名の複製の問題を解決しません。
データに「繰り返しキー」がある場合、それは多くの場合、データ構造の問題であり、配列構造を再設計する必要があります。
特定のフィールドでソートするには、 USORTなどのカスタムソートメソッドを使用する必要があります。
キー名でソートし、キー名が一意であることを確認する場合は、フィールドが一意であることを確認してから、 krsortを使用することができます。
配列キーソートに興味がある場合は、公式PHPドキュメントをお勧めします: Krsort - キーごとに逆の順序で配列をソートします