сортировка — PHP сортировать объект с помощью usort на основе двух значений

Я пытаюсь отсортировать массив моего объекта на основе минимального 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?

1

Решение

Сортировать по полю «существует» (и, как я полагаю, чем больше процентов всех существующих продуктов с тележками, тем выше должно быть отсортировано)

Я бы посоветовал вам использовать array_filter, чтобы получить простой подсчет того, сколько продуктов «существует» по сравнению с общим количеством, например.

$exists = count(
array_filter(
$object->products,
function ($product) {
return $product->exist;
}
)
) / count($object->products);

Затем сравните рассчитанный $exists значение для двух сравниваемых корзин.

Сортировка по нескольким полям (существует, а затем сумма), я думаю, вам нужно позвонить usort дважды, в задний ход порядок — сортировка по sum первый затем от exists

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]