Php Can';t根据两个变量计算usort逻辑

Php Can';t根据两个变量计算usort逻辑,php,usort,Php,Usort,我有一个对象(目标)数组,我想根据它们的两个属性进行排序,状态和决战日期 规则如下: 状态: 设计 批准 进行中 完成 存档 如果目标的状态为4(已完成)或5(已存档),则DueDate不重要 如果一个目标既不是4也不是5,并且它的截止日期小于现在,那么它是“过期”的,应该在顶部 如果目标未“过期”,则状态顺序决定其位置(从最低到最高) 如果$a和$b都是“过期”的,则具有最早到期日的那一个更为重要 命令应为: 逾期 设计 批准 进行中 完成 存档 这是我最后一次尝试: function cmp

我有一个对象(目标)数组,我想根据它们的两个属性进行排序,
状态
决战日期

规则如下:

状态:

  • 设计
  • 批准
  • 进行中
  • 完成
  • 存档
  • 如果目标的状态为4(已完成)或5(已存档),则
    DueDate
    不重要

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

    如果目标未“过期”,则状态顺序决定其位置(从最低到最高)

    如果
    $a
    $b
    都是“过期”的,则具有最早
    到期日的那一个更为重要

    命令应为:

  • 逾期
  • 设计
  • 批准
  • 进行中
  • 完成
  • 存档
  • 这是我最后一次尝试:

    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;
    }
    
    函数cmp($a,$b)
    {
    $now=新日期时间(“now”);
    $aDueDate=新日期时间($a->GetDueDate());
    $bDueDate=newdatetime($b->GetDueDate());
    如果($a->GetStatus()!=4&&$a->GetStatus()!=5&&$b->GetStatus()!=4&&$b->GetStatus()!=5){
    如果($aDueDate<$now | |$bDueDate<$now){
    如果($aDueDate==$bDueDate){
    返回0;
    }
    回报率($adudate<$bDueDate)?-1:1;
    }
    }
    elseif(($a->GetStatus()==4 | |$a->GetStatus()==5)&($b->GetStatus()!=4&&$b->GetStatus()!=5)){
    返回-1;
    }
    其他($a->GetStatus()!=4&&$a->GetStatus()!=5)&&($b->GetStatus()==4 | |$b->GetStatus()==5)){
    返回1;
    }
    如果($a->GetStatus()==b->GetStatus()){
    返回0;
    }
    返回($a->GetStatus()<$b->GetStatus())?-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;
    }
    
    函数cmp($a,$b){
    $now=新日期时间(“now”);
    $aDueDate=新日期时间($a->GetDueDate());
    $bDueDate=newdatetime($b->GetDueDate());
    $aStatus=$a->GetStatus();
    $b状态=$b->GetStatus();
    $UncompleteStatuses=数组(1,2,3);
    //如果状态相同,则使用日期(可能不需要)
    如果($aStatus==$bStatus){
    回报($aDueDate<$bDueDate?-1:1);
    }   
    //如果逾期付款:
    if(在数组中($aStatus,$incomplettestatus)&&$aDueDate<$now){
    如果B逾期了,只考虑日期。
    if(在数组中($bStatus,$incomplettestatus)&&$bDueDate<$now){
    回报($aDueDate<$bDueDate?-1:1);
    }   
    return-1;//绝对是第一个
    }   
    //如果B逾期:
    elseif(在数组中($bStatus,$incomplettestatus)&&$bDueDate<$now){
    返回1;//B肯定是第一个(我们从上面知道A没有过期)
    }   
    //A和B均未过期;按状态订购
    返回$aStatus-$bStatus;
    }
    

    .

    以下各项应满足您的要求:

    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;
    }
    
    函数cmp($a,$b){
    $now=新日期时间(“now”);
    $aDueDate=新日期时间($a->GetDueDate());
    $bDueDate=newdatetime($b->GetDueDate());
    $aStatus=$a->GetStatus();
    $b状态=$b->GetStatus();
    $UncompleteStatuses=数组(1,2,3);
    //如果状态相同,则使用日期(可能不需要)
    如果($aStatus==$bStatus){
    回报($aDueDate<$bDueDate?-1:1);
    }   
    //如果逾期付款:
    if(在数组中($aStatus,$incomplettestatus)&&$aDueDate<$now){
    如果B逾期了,只考虑日期。
    if(在数组中($bStatus,$incomplettestatus)&&$bDueDate<$now){
    回报($aDueDate<$bDueDate?-1:1);
    }   
    return-1;//绝对是第一个
    }   
    //如果B逾期:
    elseif(在数组中($bStatus,$incomplettestatus)&&$bDueDate<$now){
    返回1;//B肯定是第一个(我们从上面知道A没有过期)
    }   
    //A和B均未过期;按状态订购
    返回$aStatus-$bStatus;
    }
    

    实际上,在查看了你的代码之后,我意识到我的工作实际上是正常工作的,我只是在中间的ELSF语句中有了1和1的开关。实际上,在看了你的代码之后,我意识到我的工作实际上是正常工作的,我只是在中间的ELSF语句中有了1和1的开关。