我有一个数组,它包含多个具有许多属性的对象。
我想在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');
注:我本想编辑帕特里克的,但我不确定我的编辑是否有效。他走在了正确的轨道上。