Я пытаюсь отсортировать массив моего объекта на основе минимального SUM
, Это работает, но я хочу добавить в мою функцию usort еще одно сравнение, которое предпочтет объект, у которого будет одно значение 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]
потому что у него есть 1 товар, которого не существует.
Поэтому я хочу сделать заказ на основе существующего продукта, а затем 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
?
Сортировать по полю «существует» (и, как я полагаю, чем больше процентов всех существующих продуктов с тележками, тем выше должно быть отсортировано)
Я бы посоветовал вам использовать array_filter, чтобы получить простой подсчет того, сколько продуктов «существует» по сравнению с общим количеством, например.
$exists = count(
array_filter(
$object->products,
function ($product) {
return $product->exist;
}
)
) / count($object->products);
Затем сравните рассчитанный $exists
значение для двух сравниваемых корзин.
Сортировка по нескольким полям (существует, а затем сумма), я думаю, вам нужно позвонить usort
дважды, в задний ход порядок — сортировка по sum
первый затем от exists
Других решений пока нет …