現在の位置: ホーム> 最新記事一覧> uksortを使用するときに同じキーを並べ替えることを避ける方法

uksortを使用するときに同じキーを並べ替えることを避ける方法

gitbox 2025-05-31

1。uksort ()関数の紹介

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
)

2。問題の説明:同じキーによって引き起こされる繰り返し並べ替え

キーがある種の前処理またはマッピングを受けた場合、異なる元のキーが「同じキー」と見なされる場合があります。この時点で、比較関数は頻繁かつ繰り返し呼ばれ、パフォーマンスに影響を与えます。例えば:

 $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」は「同じキー」として扱われ、比較関数はそれらを複数回比較する場合があります。大きな配列の場合、この繰り返しは効率を大幅に低下させます。

3。繰り返しのソートを回避するという中心的なアイデア

繰り返しの並べ替えを避けるために、鍵は、比較関数の同じ「論理キー」の繰り返し計算を減らし同等のキーの不必要な比較を避けることです。一般的な慣行は次のとおりです。

  1. キャッシュマッピング結果:比較関数は、静的キャッシュを内部的に使用して、キーマッピング値の繰り返し計算を避けます。

  2. まず、キーのプリプロースと重複排除:マッピングテーブルを作成し、キーを分類し、ソート時にマッピング結果と直接比較します。

  3. 補助配列のソートを使用します。マッピングされた値を補助キーとして使用してマッピング値のセットを形成し、 array_multisort()またはその他のソート関数を使用して、繰り返し呼び出しを避けます。

4.特定の実装の例

ソリューション1:関数内のキャッシュマップの比較

$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回のみ実行され、繰り返し計算を回避し、パフォーマンスの改善が行われます。

ソリューション2:マッピングキーの前処理、ソートの支援

$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の関数を比較するための複数の呼び出しを回避し、マッピングルールが複雑な場合に使用するのに適しています。


5。概要

  • uksort()を使用する場合、比較関数は、特にキーを均等に変換または分類する必要がある場合に何度も呼び出されます。

  • 比較関数でキャッシュを使用するか、事前にキーをマッピングすることにより、繰り返しの並べ替えを効果的に回避し、パフォーマンスとコードの明確さを改善できます。

  • 選択するソリューションは、配列のサイズ、マッピングルールの複雑さ、パフォーマンス要件に依存します。

上記のスキルを習得した後、 uksort()を使用して、複雑なキーをより柔軟かつ効率的に並べ替えることができます。