按照PHP中相对位置的值对数组进行排序

时间:2015-07-23 15:47:43

标签: php arrays sorting

我使用的是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函数保留了相等元素的相对位置?

1 个答案:

答案 0 :(得分:1)

简短的回答是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;

}