1

我有一组对象(目标),我想根据它们的 2 个属性(theStatusDueDate.

以下是规则:

状态:

  1. 设计
  2. 得到正式认可的
  3. 进行中
  4. 完全的
  5. 存档

如果目标的状态为 4(已完成)或 5(已归档),则DueDate无关紧要。

如果一个目标既不是 4 也不是 5 并且它DueDate小于现在,那么它是“过期”并且应该在顶部

如果一个目标不是“过期”,那么状态的顺序决定了它的位置(从最低到最高)

如果$a$b都是“过期”,那么最早的那个DueDate更重要

顺序应该是:

  1. 逾期
  2. 设计
  3. 得到正式认可的
  4. 进行中
  5. 完全的
  6. 存档

这是我尝试的最后一件事:

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;
}

像这样对数组进行排序:

  1. 完全的
  2. 存档
  3. 逾期
  4. 设计
  5. 得到正式认可的
  6. 进行中
4

1 回答 1

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;
}

这是一个测试键盘

于 2013-04-25T13:25:22.340 回答