我们改变了Array的顺序

时间:2011-09-02 13:07:49

标签: php usort

我有一行的usort函数:return 0。
我试图在stdClass对象的数组上使用它,并且它改变了 他们的订单,这怎么可能?

3 个答案:

答案 0 :(得分:10)

您假设的属性称为stability稳定排序算法不会更改相等元素的顺序。

php的排序功能稳定(因为非稳定排序可能会稍快一些)。来自documentation of usort

  

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

如果您需要稳定的排序算法,则必须implement it yourself

答案 1 :(得分:1)

这是因为该功能意味着“我真的不在乎它们是如何分类的,它们与我相同”。通过这个简单的示例,我收到了反向数组:

function sortaaa($a,$b) {return 0;}
$array = array(1,2,3,4,5);
usort($array,"sortaaa");
var_dump($array);
//prints array(5) { [0]=> int(5) [1]=> int(4) [2]=> int(3) [3]=> int(2) [4]=> int(1) }

所以看起来PHP在函数usort中以相反的顺序循环数组。因此,请注意usort manual状态

  

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

答案 2 :(得分:0)

如果您正在寻找稳定 usort的快速解决方案,则可以像以下示例中那样使用uksort

<?php

uksort($array, function ($ak, $bk) use ($array) {
    $a = $array[$ak];
    $b = $array[$bk];

    if ($a['foo'] === $b['foo']) 
        return $ak - $bk;

    return $a['foo'] > $b['foo'] ? 1 : -1;
});

仅当$array的初始索引(键)按升序排列时,此方法才能按预期工作。