Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP usort reorders数组排序值对于所有_Php_Sorting_Usort - Fatal编程技术网

PHP usort reorders数组排序值对于所有

PHP usort reorders数组排序值对于所有,php,sorting,usort,Php,Sorting,Usort,我使用usort对数组进行排序,每个元素中都有一个关联数组 当我在数组中排序的所有值都相同时,它仍然会更改数组中元素的位置,有没有办法防止这种情况发生 例如: array( array('name' => 'Ben', 'authn_weight' => 85.3), array('name' => 'Josh', 'authn_weight' => 85.3), array('name' => 'Fred', 'authn_weight'

我使用usort对数组进行排序,每个元素中都有一个关联数组

当我在数组中排序的所有值都相同时,它仍然会更改数组中元素的位置,有没有办法防止这种情况发生

例如:

array(
    array('name' => 'Ben', 'authn_weight' => 85.3),
    array('name' => 'Josh', 'authn_weight' => 85.3),
    array('name' => 'Fred', 'authn_weight' => 85.3)
);
可更改为:

array(
    array('name' => 'Josh', 'authn_weight' => 85.3),
    array('name' => 'Ben', 'authn_weight' => 85.3),
    array('name' => 'Fred', 'authn_weight' => 85.3)
);
这是排序功能:

private function weightSortImplementation($a, $b){ 
    $aWeight = $a['autn_weight'];
    $bWeight = $b['autn_weight'];

    if ($aWeight == $bWeight) {
        return 0;
    }
    return ($aWeight < $bWeight) ? 1 : -1;
}
private function weightSortImplementation($a,$b){
$a重量=$a['autn_重量];
$bWeight=$b['autn_weight'];
如果($aWeight==$bWeight){
返回0;
}
返回($a重量<$b重量)?1:-1;
}
我检查了
weightSortImplementation
函数是否总是返回0,表明它们是相同的。那么,为什么仍要对阵列进行重新排序呢?

如果两个成员比较相等,则它们在排序数组中的相对顺序未定义

在两个元素相等的情况下,可以使用此函数保持顺序:

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;
} 
函数mergesort(&$array,$cmp_函数='strcmp'){
//大小小于2的数组不需要执行任何操作。
if(count($array)<2)返回;
//将阵列一分为二
$Middle=计数($array)/2;
$array1=数组\ U片($array,0,$MEDICED);
$array2=数组\ U片($array,$Middle);
//递归对两半进行排序
合并排序($array1,$cmp_函数);
合并排序($array2,$cmp_函数);
//如果所有$array1都是Aha,则为

它基本上包括三个步骤:

  • 修饰;将每个值转换为数组,值作为第一个元素,键/索引作为第二个元素
  • 分拣(按正常方式)
  • 取消装饰;反向执行步骤1
  • 这是(我已经根据您的特定用例对其进行了调整):

    诀窍在于以下断言:

    array($x, 0) < array($x, 1)
    
    array($x,0)

    这就是保持数组正确顺序的原因。而且,不需要递归:)

    这是一个有趣的问题。我刚刚测试了这个问题,在使用
    usort
    之后,顺序被颠倒了。它们不能使用a,这对元素的顺序没有任何保证,如果它们相等。有什么方法可以防止吗?可能使用differentent排序方法?或者更改排序实现,如果它们相同,我想我可以让权重排序返回1或-1吗?我想你应该对源代码进行属性化。我发现这个方法重复了。super stuff bro..!!嗯,这在PHP5.4上似乎不适用。@JensKohl你有一个可复制的测试脚本吗?我可以k at?@JensKohl啊,你不能在数组上做一个
    strcmp()
    ;-)你可能想检查我关于稳定排序的问题。@Ja͢ck我不得不重读你的答案好几次,但它发出了咔哒声,现在对我有效。谢谢。
    array($x, 0) < array($x, 1)