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

时间:2012-01-17 19:33:45

标签: php

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

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_multisort可能就是答案,但我似乎无法弄明白。

2 个答案:

答案 0 :(得分:1)

编写您自己的比较函数并按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");

答案 1 :(得分:1)

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");