ホームページ > バックエンド開発 > PHPチュートリアル > PHP の組み込みソート関数は、等しい値を持つ連想配列をソートするときにキーの順序を保持できますか?

PHP の組み込みソート関数は、等しい値を持つ連想配列をソートするときにキーの順序を保持できますか?

Mary-Kate Olsen
リリース: 2024-11-04 07:14:30
オリジナル
730 人が閲覧しました

Can PHP's built-in sorting functions preserve key order when sorting associative arrays with equal values?

PHP ソートでのキー順序の保持

質問:

連想配列をソートできますかPHP では、組み込みの並べ替え関数を使用して、値が等しい場合に元のキーの順序を維持しますか?

Background:

uasort などの PHP の並べ替え関数は安定したものを提供しませんソートとは、等しい値を持つ要素の順序がソート後に変更される可能性があることを意味します。

答え:

残念ながら、PHP はバージョン 4.1.0 以降、安定したソートを正式にサポートしていません。したがって、これを実現するにはカスタム関数を実装する必要があります。

カスタム関数:

1 つの解決策は、O(n*log を保証するマージ ソート関数を実装することです。 (n)) 複雑さを軽減し、キーの順序を維持します。マージ ソート関数 (mergesort) の例を次に示します。

<code class="php">function mergesort(&$array, $cmp_function = 'strcmp') {
    // Handle small arrays
    if (count($array) < 2) return;

    // Split the array into two parts
    $halfway = count($array) / 2;
    $array1 = array_slice($array, 0, $halfway);
    $array2 = array_slice($array, $halfway);

    // Recursively sort the two halves
    mergesort($array1, $cmp_function);
    mergesort($array2, $cmp_function);

    // Merge the sorted halves into the original array
    $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++];
}</code>
ログイン後にコピー

この関数を使用すると、等しい値を持つ要素の元のキー順序を維持しながら、連想配列を並べ替えることができます。

追加リソース:

  • PHP 安定ソート フォーラム スレッド

以上がPHP の組み込みソート関数は、等しい値を持つ連想配列をソートするときにキーの順序を保持できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート