我有一个包含多个具有许多属性的对象的数组。
我想基于两个对象属性在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排序。
有人可以帮我这个程序吗?
非常感谢!
答案 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的编辑进行编辑,但我不确定我是否工作过。他走在正确的轨道上。