在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的ussort页面上。我把它贴在这里是为了方便你。请注意,我对这段代码给予了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;

}