更改数组的顺序


usort changing Array's order

我有一个只有一行的ussort函数:返回0。
我试图在stdClass对象的数组上使用它,它改变了
他们的顺序,这怎么可能?

你假定的属性叫做stability: stable排序算法不会改变相等元素的顺序。

php的排序函数不是稳定的(因为非稳定排序可能会稍微快一些)。来自usort的文档:

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

如果你想要一个稳定的排序算法,你必须自己实现它。

这是因为这个函数的意思是"我真的不在乎它们是如何排序的,它们等于我"。使用这个简单的示例,我收到反向数组:

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手册中指出

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

如果您正在寻找稳定的 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的初始索引(键)按升序排列时才能正常工作