我正在尝试基于最小SUM
对对象数组进行排序。这是有效的,但我想在我的usort函数中添加另一个比较,它将更喜欢object,它将有一个值为true。我的目标:
object(Basket)[33]
public 'products' =>
array (size=2)
0 =>
object(Product)[13]
public 'name' => string 'Name ONE' (length=8)
public 'price' => float 0.75
public 'exist' => boolean true
1 =>
object(Product)[7]
public 'name' => string 'Name TWO' (length=8)
public 'price' => float 2.39
public 'exist' => boolean true
public 'sum' => float 3.14
object(Basket)[34]
public 'products' =>
array (size=2)
0 =>
object(Product)[19]
public 'name' => string 'Name ONE' (length=8)
public 'price' => float 0.75
public 'exist' => boolean true
1 =>
object(Product)[72]
public 'name' => string 'Name TWO' (length=8)
public 'price' => null
public 'exist' => boolean false
public 'sum' => float 0.75
object(Basket)[35]
public 'products' =>
array (size=2)
0 =>
object(Product)[1]
public 'name' => string 'Name ONE' (length=8)
public 'price' => float 0.75
public 'exist' => boolean true
1 =>
object(Product)[2]
public 'name' => string 'Name TWO' (length=8)
public 'price' => float 1.75
public 'exist' => boolean true
public 'sum' => float 2.5
如果我sort
,则订单为Basket[34],Basket[35],Basket[33]
。
但是我想要Basket[35],Basket[33]
并且最后Basket[34]
,因为他有一个产品,它不存在。
所以我想根据产品的存在情况订购,然后sort
按SUM
订购。
我有这个,但它不起作用:
usort($h_basket[$i], function($a, $b) {
return $a->sum > $b->sum;
});
usort($h_basket[$i], function($a, $b) {
$unfinded_a = 0;
$unfinded_b = 0;
foreach ($a->products as $product) {
if(!$product->exist) {
$unfinded_a++;
}
}
foreach ($b->products as $product) {
if(!$product->exist) {
$unfinded_b++;
}
}
if ($unfinded_a != 0 || $unfinded_b != 0)
return $unfinded_b > $unfinded_a;
});
可以使用usort
执行此操作,还是必须使用array_multisort
?
答案 0 :(得分:0)
按"存在"排序字段(我假设存在的所有购物车产品的百分比越大,应该排序的越高)
我建议您使用array_filter来简单地计算出有多少产品存在'与总数相比。
$exists = count(
array_filter(
$object->products,
function ($product) {
return $product->exist;
}
)
) / count($object->products);
然后比较所比较的两个篮子的计算$exists
值。
要按多个字段排序(存在,然后求和),我相信您需要按反向顺序调用usort
两次 - 按sum
排序首先然后按exists