usort值数组将没有值的索引放在底部


usort array of values putting indexes with no value at the bottom

我正在使用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;
    }
}

以上就是我现在拥有的代码。它并没有按照我想要的方式工作。每个物体都有保修和保修说明。如果有保修,它会说"可用"。

代码获取保修并将其与今天的日期进行比较,以确定保修剩余的月数,我想按这个数字进行排序。

如何使此功能发挥作用,以便将任何没有保修的项目放置在阵列的底部?

这里有一个技巧:将$a->Warranty=="Available"$b->Warranty == "Available"的结果转换为int(将为零或一),然后对所得到的进行类似的减法运算。如果a有保修,而b没有,这将是1-0,或者a更大。如果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;