2015-07-23 2 views
1

Я использую usort() и uasort(). Мне нужно отсортировать массив по значениям, используя пользовательскую функцию сравнения.Сортировка массива по значениям в PHP, относительные позиции

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

Док говорит: Примечание:

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

Возникает вопрос: есть ли функция PHP, что означает сохранение относительного положения равных элементов?

+1

Я думаю, просто добавить еще критерии ваш сравнить если два элемента равны. – Rizier123

ответ

0

Короткий ответ: PHP не имеет встроенной функции для этого, поэтому вам придется написать один. В большинстве случаев не имеет значения, перемещает ли элемент элемент вверх или вниз, если он считается равным смежному элементу. Примером может служить любой массив целых чисел. Если два одинаковые, кто заботится о том, в каком порядке они находятся, пока они вместе.

Для случаев, когда вам необходимо поддерживать порядок списков, Sreid написал для этого очень хорошую функцию. Это фактически на странице usort на php.net. Я вставляю его здесь для вашего удобства. Знайте, что я даю sreid полный кредит для этого кода, и я уже упоминал, где его исходный код можно найти в общественном форуме:

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; 

}

Смежные вопросы