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 中国語 Web サイトの他の関連記事を参照してください。