按对象参数对对象数组进行排序,然后按另一个参数的字母顺序对其进行排序


Sort array of objects by object param, then sort those by another param alphabetically

所以,我有一个对象数组,我想像这样排序:

Array
(
[463] => stdClass Object
    (
        [name] => Organic 12
        [total_weight] => 5
    )
[340] => stdClass Object
    (
        [name] => Organic 12b
        [total_weight] => 5
    )
[340] => stdClass Object
    (
        [name] => Organic 12c
        [total_weight] => 5
    )
[532] => stdClass Object
    (
        [name] => Alpha 10
        [total_weight] => 4
    )
[203] => stdClass Object
    (
        [name] => General 5
        [total_weight] => 3
    )

)

在所有对象的total_weight从高到低排序的情况下,在这些排序中,对象按名称的字母顺序排序。我可以用php的usort成功地按total_weight对它们进行排序,但不知道如何对结果进行子排序。仅使用usort,排序后的结果不一致,因此在一个结果中,一个对象的名称可能会出现在另一个对象之上,但在另一个中则不会。

我想也许array_multiport可能是答案,但我似乎想不通。

编写自己的比较函数并通过usort应用它。诀窍是在权重相等时应用额外的比较。

应该是这样的:

function compareObj($a, $b)
{
    if ($a->total_weight == $b->total_weight) {
        return strcmp($a->name, $b->name);
    }
    return ($a->total_weight > $b->total_weight) ? -1 : 1;
}
usort($array, "compareObj");
function cmp($a, $b)
{
    if ($a->total_weight == $b->total_weight) {
        return strcmp($a->name, $b->name);
    }else{
       return $a->total_weight >  $b->total_weight ? -1 : 1
    }
}
usort($array, "cmp");