簡體   English   中英

在PHP中按值對數組進行排序以維護相對位置

[英]Sort array by values in PHP mantaining relative positions

我正在使用usort()和uasort()。 我需要使用用戶定義的比較函數按值對數組進行排序。

php.net/manual/en/function.usort.php

該文檔說:注意:

If two members compare as equal, their relative order in the sorted array is undefined.

問題是:是否有任何PHP函數可以保持相等元素的相對位置?

簡短的答案是PHP沒有內置函數可以執行此操作,因此您必須編寫一個。 在大多數情況下,如果排序被認為與相鄰元素相等,則排序將元素向上或向下移動都無關緊要。 一個例子是任何整數數組。 如果兩個相同,只要在一起,誰在乎它們的順序。

對於需要維護列表順序的情況,Sreid為此編寫了一個很好的函數。 它實際上在php.net的usort頁面上。 為了方便起見,我將其粘貼在這里。 請注意,我對此代碼給予了充分的肯定,並且我已經提到了可以在公共論壇上找到其原始代碼的地方:

function mergesort(&$array, $cmp_function = 'strcmp') {
// Arrays of size < 2 require no action.
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);
// Recurse to sort the two halves
mergesort($array1, $cmp_function);
mergesort($array2, $cmp_function);
// If all of $array1 is <= all of $array2, just append them.
if (call_user_func($cmp_function, end($array1), $array2[0]) < 1) {
    $array = array_merge($array1, $array2);
    return;
}
// Merge the two sorted arrays into a single sorted 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++];
return;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM