と の 2 つのプロパティに基づいて並べ替えたいオブジェクト (ゴール) の配列があり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;
}
次のように配列を注文します。
- 完了
- アーカイブ済み
- 期限切れ
- デザイン
- 承認済み
- 進行中