Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah fungsi pengisihan terbina dalam PHP mengekalkan susunan kunci apabila menyusun tatasusunan bersekutu dengan nilai yang sama?

Bolehkah fungsi pengisihan terbina dalam PHP mengekalkan susunan kunci apabila menyusun tatasusunan bersekutu dengan nilai yang sama?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 07:14:30677semak imbas

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

Memelihara Susunan Utama dalam Pengisihan PHP

Soalan:

Bolehkah kita mengisih tatasusunan bersekutu dalam PHP, mengekalkan susunan kunci asal apabila nilai adalah sama, menggunakan fungsi pengisihan terbina dalam?

Latar Belakang:

Fungsi isihan PHP seperti uasort tidak menawarkan stabil pengisihan, bermakna susunan elemen dengan nilai yang sama mungkin berubah selepas pengisihan.

Jawapan:

Malangnya, PHP tidak menyokong pengisihan stabil secara rasmi selepas versi 4.1.0. Oleh itu, melaksanakan fungsi tersuai adalah perlu untuk mencapai ini.

Fungsi Tersuai:

Satu penyelesaian ialah melaksanakan fungsi isihan gabungan, yang menjamin O(n*log (n)) kerumitan dan mengekalkan susunan utama. Berikut ialah contoh fungsi isihan gabungan (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>

Dengan menggunakan fungsi ini, anda boleh mengisih tatasusunan bersekutu anda sambil mengekalkan susunan kunci asal untuk elemen dengan nilai yang sama.

Sumber Tambahan:

  • Benang Forum Isih Stabil PHP

Atas ialah kandungan terperinci Bolehkah fungsi pengisihan terbina dalam PHP mengekalkan susunan kunci apabila menyusun tatasusunan bersekutu dengan nilai yang sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn