我有一系列对象(目标),我想根据其中的两个属性Status
和DueDate
进行排序。
以下是规则:
以下状态:
如果目标的状态为4(已完成)或5(已存档),则DueDate
无关紧要。
如果一个目标既不是4也不是5而且DueDate
小于现在那么它是“过期”并且应该在顶部
如果目标不是“过期”,那么状态的顺序决定了它的位置(从最低到最高)
如果$a
和$b
都是“过期”,那么最早DueDate
的那个更为重要
订单应该是:
这是我尝试过的最后一件事:
function cmp($a, $b)
{
$now = new DateTime("now");
$aDueDate = new DateTime($a->GetDueDate());
$bDueDate = new DateTime($b->GetDueDate());
if($a->GetStatus() != 4 && $a->GetStatus() != 5 && $b->GetStatus() != 4 && $b->GetStatus() != 5){
if($aDueDate < $now || $bDueDate < $now){
if($aDueDate == $bDueDate){
return 0;
}
return ($aDueDate < $bDueDate) ? -1 : 1;
}
}
elseif(($a->GetStatus() == 4 || $a->GetStatus() == 5) && ($b->GetStatus() != 4 && $b->GetStatus() != 5)) {
return -1;
}
elseif(($a->GetStatus() != 4 && $a->GetStatus() != 5) && ($b->GetStatus() == 4 || $b->GetStatus() == 5)){
return 1;
}
if ($a->GetStatus() == $b->GetStatus()) {
return 0;
}
return ($a->GetStatus() < $b->GetStatus()) ? -1 : 1;
}
对数组的命令是这样的:
答案 0 :(得分:1)
以下内容应符合您的要求:
function cmp($a, $b) {
$now = new DateTime("now");
$aDueDate = new DateTime($a->GetDueDate());
$bDueDate = new DateTime($b->GetDueDate());
$aStatus = $a->GetStatus();
$bStatus = $b->GetStatus();
$incompleteStatuses = array(1, 2, 3);
// use date if same status (might not be needed)
if ($aStatus == $bStatus) {
return ($aDueDate < $bDueDate ? -1 : 1);
}
// if A is overdue:
if (in_array($aStatus, $incompleteStatuses) && $aDueDate < $now) {
// if B is overdue too, only consider dates
if (in_array($bStatus, $incompleteStatuses) && $bDueDate < $now) {
return ($aDueDate < $bDueDate ? -1 : 1);
}
return -1; // A definitely first
}
// if B is overdue:
elseif (in_array($bStatus, $incompleteStatuses) && $bDueDate < $now) {
return 1; // B definitely first (we know A is not overdue from above)
}
// both A and B are not overdue; order by status
return $aStatus - $bStatus;
}