2013-04-25 60 views
1

我有一个对象数组(目标),我想根据它们的属性2,StatusDueDate进行排序。无法根据2个变量找出usort逻辑

下面是规则:

以下状态:

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

哪些订单数组升IKE这样:

  1. 完成
  2. 存档
  3. 逾期
  4. 设计
  5. 批准
  6. 在进步

回答

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

Here's a test codepad

+0

完美地工作,非常感谢。 – 2013-04-25 13:32:47

+0

其实在看了你的代码之后,我意识到我的程序确实可以正常工作,我只是在中间的elseif语句中将-1和1切换了起来。 – 2013-04-25 13:38:15