uksort(array&$ array、callable $ callback):ブール関数は、配列のキーをソートします。 $ callbackは、2つのキー名をパラメーターとして受け入れるユーザー定義の比較関数であり、ゼロ以上の値をより少ない値、並べ替え順序を決定します。
サンプルコード:
$array = [
'apple' => 1,
'banana' => 2,
'cherry' => 3,
];
uksort($array, function($a, $b) {
return strcmp($a, $b);
});
print_r($array);
出力:
Array
(
[apple] => 1
[banana] => 2
[cherry] => 3
)
キーがある種の前処理またはマッピングを受けた場合、異なる元のキーが「同じキー」と見なされる場合があります。この時点で、比較関数は頻繁かつ繰り返し呼ばれ、パフォーマンスに影響を与えます。例えば:
$array = [
'a_1' => 10,
'a_2' => 20,
'b_1' => 30,
];
uksort($array, function($key1, $key2) {
// 下線の前の部品を比較してください
$part1 = explode('_', $key1)[0];
$part2 = explode('_', $key2)[0];
return strcmp($part1, $part2);
});
この時点で、 「A_1」と「A_2」は「同じキー」として扱われ、比較関数はそれらを複数回比較する場合があります。大きな配列の場合、この繰り返しは効率を大幅に低下させます。
繰り返しの並べ替えを避けるために、鍵は、比較関数の同じ「論理キー」の繰り返し計算を減らし、同等のキーの不必要な比較を避けることです。一般的な慣行は次のとおりです。
キャッシュマッピング結果:比較関数は、静的キャッシュを内部的に使用して、キーマッピング値の繰り返し計算を避けます。
まず、キーのプリプロースと重複排除:マッピングテーブルを作成し、キーを分類し、ソート時にマッピング結果と直接比較します。
補助配列のソートを使用します。マッピングされた値を補助キーとして使用してマッピング値のセットを形成し、 array_multisort()またはその他のソート関数を使用して、繰り返し呼び出しを避けます。
$array = [
'a_1' => 10,
'a_2' => 20,
'b_1' => 30,
'b_2' => 40,
'c_1' => 50,
];
uksort($array, function($key1, $key2) {
static $cache = [];
if (!isset($cache[$key1])) {
$cache[$key1] = explode('_', $key1)[0];
}
if (!isset($cache[$key2])) {
$cache[$key2] = explode('_', $key2)[0];
}
return strcmp($cache[$key1], $cache[$key2]);
});
print_r($array);
このようにして、 Exploit( '_'、$ key)操作は1回のみ実行され、繰り返し計算を回避し、パフォーマンスの改善が行われます。
$array = [
'a_1' => 10,
'a_2' => 20,
'b_1' => 30,
'b_2' => 40,
'c_1' => 50,
];
// マップキーの配列を生成します
$mappedKeys = [];
foreach (array_keys($array) as $key) {
$mappedKeys[$key] = explode('_', $key)[0];
}
// キーをマッピングしてキー名を並べ替えます
uasort($mappedKeys, function($a, $b) {
return strcmp($a, $b);
});
// ソートされたマッピングキーに従ってメイン配列を再構築します
$newArray = [];
foreach ($mappedKeys as $originalKey => $_) {
$newArray[$originalKey] = $array[$originalKey];
}
print_r($newArray);
このソリューションは、 UKSORTの関数を比較するための複数の呼び出しを回避し、マッピングルールが複雑な場合に使用するのに適しています。
uksort()を使用する場合、比較関数は、特にキーを均等に変換または分類する必要がある場合に何度も呼び出されます。
比較関数でキャッシュを使用するか、事前にキーをマッピングすることにより、繰り返しの並べ替えを効果的に回避し、パフォーマンスとコードの明確さを改善できます。
選択するソリューションは、配列のサイズ、マッピングルールの複雑さ、パフォーマンス要件に依存します。
上記のスキルを習得した後、 uksort()を使用して、複雑なキーをより柔軟かつ効率的に並べ替えることができます。