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