2012-07-10 53 views
0

我正在使用usort排序我的数组。我有一个包含保修日期的阵列。还有一个排序函数。然而,我遇到的问题是,并非数组中的所有项目都有保修。我想对数组进行排序,但总是在底部放置没有日期的数组。usort数组的值将索引在底部没有值

function warrantyA($a, $b){ 
    if($a->Warranty == "Available" and $b->Warranty == "Available"){ 
     $a = explode('/', $a->WarrantyDescription); 
     $b = explode('/', $b->WarrantyDescription); 

     $today = date("d-m-Y"); 

     $diffa = abs(strtotime($a[0]) - strtotime($today)); 
     $diffb = abs(strtotime($b[0]) - strtotime($today)); 

     $a = floor($diffa/86400/30); 
     $b = floor($diffb/86400/30); 
     return $a - $b; 
    } 
} 

以上是我现在使用的代码,它并不按照我希望的方式工作。每个对象都有保修和保修说明。如果有保修,那么它会说“可用”。

该代码需要保修,并将其与今天的日期进行比较,以确定保修期内的剩余月数,并且我想按该数字对其进行排序。

我该如何使这个功能,使任何没有保修的物品放置在阵列的底部?

回答

2

这里有一些小技巧:将$a->Warranty=="Available"$b->Warranty == "Available"的结果转换为整数(将为零或一),然后对所得结果进行类似的减法运算。如果a有保修,而b没有保修,这将是1 - 0,或更大。如果a不但是b,它将返回-1,如果两者都不是,则返回0。

$a_has = (int) $a->Warranty == "Available"; 
$b_has = (int) $b->Warranty == "Available"; 
if($a_has and $b_has){ 
    // keep your code here 
} 

return $a_has - $b_has; 
+0

Intresting。我会试试这个,让你知道它是否适合我。感谢您的输入! – Marc 2012-07-10 16:58:20

+0

好吧,这工作时,我按降序排序!谢谢!你有任何提升技巧吗?如显示最短保修率首先上升到最长,然后显示那些没有任何?现在发生的事情是它首先显示没有保修的产品。 – Marc 2012-07-10 18:15:25

+0

交换最后一个表达式中的两个项,这应该将它们移动到结果的另一端。然后,保证人的排序全部在你的代码中。 – 2012-07-10 18:40:48