ホームページ  >  記事  >  バックエンド開発  >  PHP で uasort を使用して連想配列をソートするときにキーの順序を維持するにはどうすればよいですか?

PHP で uasort を使用して連想配列をソートするときにキーの順序を維持するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 18:44:02127ブラウズ

How Can I Maintain Key Order While Sorting Associative Arrays in PHP Using uasort?

PHP でのキー順序の維持 uasort によるソート

PHP で uasort 関数を使用して連想配列をソートする場合、複数のキーが同じ値を共有している場合でも、元のキーの順序を保持する安定したソート。

解決策

PHP はデフォルトで安定したソートをサポートしなくなったため、カスタム関数は必須です:

<code class="php">function mergesort(&$array, $cmp_function = 'strcmp') {
    // Base cases for arrays of size < 2
    if (count($array) < 2) return;
    // Split the array in half
    $halfway = count($array) / 2;
    $array1 = array_slice($array, 0, $halfway);
    $array2 = array_slice($array, $halfway);
    // Recursively sort the halves
    mergesort($array1, $cmp_function);
    mergesort($array2, $cmp_function);
    // Handle case if $array1 is entirely less than $array2
    if (call_user_func($cmp_function, end($array1), $array2[0]) < 1) {
        $array = array_merge($array1, $array2);
        return;
    }
    // Merge the two sorted arrays
    $array = array();
    $ptr1 = $ptr2 = 0;
    while ($ptr1 < count($array1) && $ptr2 < count($array2)) {
        if (call_user_func($cmp_function, $array1[$ptr1], $array2[$ptr2]) < 1) {
            $array[] = $array1[$ptr1++];
        } else {
            $array[] = $array2[$ptr2++];
        }
    }
    // Merge the remainder
    while ($ptr1 < count($array1)) $array[] = $array1[$ptr1++];
    while ($ptr2 < count($array2)) $array[] = $array2[$ptr2++];
    return;
}</code>

使用法

単に mergesort 関数を使用して連想配列を並べ替え、それを最初の引数と値を比較するための匿名関数として渡します (オプション):

<code class="php">uasort($arr, function($a, $b){
    return ($a == $b)?1:($a - $b);
});</code>

以上がPHP で uasort を使用して連想配列をソートするときにキーの順序を維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。