2013-04-25 32 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