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


How can I sort this array of objects with many properties in PHP?

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

我想在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属性的将按最新日期森特进行排序。

有人能帮我做这个项目吗?

感谢大家的关注!

您需要使用一个用户定义的排序函数:

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

现在将对传入的数组进行排序。

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

注:我本想编辑帕特里克的,但我不确定我的编辑是否有效。他走在了正确的轨道上。