如何在PHP中对具有许多属性的对象数组进行排序?

时间:2012-07-24 17:20:28

标签: php sorting

我有一个包含多个具有许多属性的对象的数组。

我想基于两个对象属性在PHP中对它进行排序

这是一个示例对象数组,可以让您了解我正在处理的数据:

Array (
    [0] => stdClass Object (
        [username] => user98
        [sender_id] => 98
        [date_sent] => 2012-07-25 00:52:11
        [not_read] => 0
    )
    [1] => stdClass Object (
        [username] => user87
        [sender_id] => 87
        [date_sent] => 2012-07-25 00:59:15
        [not_read] => 1
    )
    [2] => stdClass Object (
        [username] => user93
        [sender_id] => 93
        [date_sent] => 2012-07-25 00:52:13
        [not_read] => 2
    )
    [3] => stdClass Object (
        [username] => user5
        [sender_id] => 5
        [date_sent] => 2012-07-25 00:52:16
        [not_read] => 0
    )
)

我需要对它进行排序:

Array (
    [1] => stdClass Object (
        [username] => user87
        [sender_id] => 87
        [date_sent] => 2012-07-25 00:59:15
        [not_read] => 1
    )
    [2] => stdClass Object (
        [username] => user93
        [sender_id] => 93
        [date_sent] => 2012-07-25 00:52:13
        [not_read] => 2
    )
    [3] => stdClass Object (
        [username] => user5
        [sender_id] => 5
        [date_sent] => 2012-07-25 00:52:16
        [not_read] => 0
    )

    [0] => stdClass Object (
        [username] => user98
        [sender_id] => 98
        [date_sent] => 2012-07-25 00:52:11
        [not_read] => 0
    )


)

排序基于对象的date属性和not_read属性,not_read> 0在排序中优先排序,然后它将查看date_sent属性并在最新的date_sent上对其进行排序。请注意,它不是基于谁具有更高的not_read属性。

那些0 not_read属性的那些将按最新的date_sent排序。

有人可以帮我这个程序吗?

非常感谢!

2 个答案:

答案 0 :(得分:4)

您需要使用用户定义的排序功能:

function sortByDate($a, $b)
{
    if($a->not_read > $b->not_read)
        return 1;
    if($a->not_read < $b->not_read)
        return -1;
    if(strtotime($a->date_sent) > strtotime($b->date_sent))
        return 1;
    if(strtotime($a->date_sent) < strtotime($b->date_sent))
        return -1;
    return 0;
}

然后使用usort调用它:

usort($array_to_sort, 'sortByDate');

传入的数组现在将被排序。

答案 1 :(得分:1)

function sortByDate($a, $b)
{
    if($a->not_read > 0 && $b->not_read == 0)
        return -1;
    if($b->not_read > 0 && $a->not_read == 0)
        return 1;
    if ($a->not_read == 0 && $b->not_read == 0 || $a->not_read > 0 && $b->not_read > 0){
        if(strtotime($a->date_sent) > strtotime($b->date_sent))
            return -1;
        if(strtotime($a->date_sent) < strtotime($b->date_sent))
            return 1;
    }

    return 0;
}

usort($array_to_sort, 'sortByDate');

注意:我会对Patrick的编辑进行编辑,但我不确定我是否工作过。他走在正确的轨道上。