2

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

我想根据两个对象属性在 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 属性。

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

谁能帮我完成这个程序?

非常感谢您的关注!

4

2 回答 2

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

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

于 2012-07-24T17:27:17.423 回答
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's 进行编辑,但我不确定我的是否有效。他走在正确的轨道上。

于 2012-07-24T17:41:58.337 回答