首頁  >  文章  >  後端開發  >  PHP 的內建排序函數在對具有相等值的關聯數組進行排序時可以保留鍵順序嗎?

PHP 的內建排序函數在對具有相等值的關聯數組進行排序時可以保留鍵順序嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-04 07:14:30677瀏覽

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

在PHP 排序中保留鍵順序

問題:

問題:

我們可以對關聯數字組進行排序嗎在PHP 中,當值相等時,使用內建排序函數保留原始鍵順序?

背景:

PHP 的排序函數(如 uasort)不提供穩定的排序函數排序,意味著排序後值相等的元素順序可能會改變。

答案:

遺憾的是,PHP 在 4.1.0 版本之後正式不再支援穩定排序。因此,需要實作一個自訂函數來實現這一點。

自訂函數:
<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>

一種解決方案是實現歸併排序函數,它保證O(n*log (n)) 複雜性並保持密鑰順序。以下是合併排序函數 (mergesort) 的範例:

透過使用此函數,您可以對關聯數組進行排序,同時保持具有相等值的元素的原始鍵順序。

  • 其他資源:
PHP 穩定排序論壇主題

以上是PHP 的內建排序函數在對具有相等值的關聯數組進行排序時可以保留鍵順序嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn