1

と の 2 つのプロパティに基づいて並べ替えたいオブジェクト (ゴール) の配列がありStatusますDueDate

ルールは次のとおりです。

ステータス:

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

ここにテスト codepad があります。

于 2013-04-25T13:25:22.340 に答える