Подсчёт количества массивов по определенным данным в php
Есть массив заказов с разными их статусами:
Array
(
[0] => stdClass Object
(
[order_id] => 16881
[order_price] => 880
[place_amount] => 1
[order_date] => 2023-03-13 17:47:53
[order_status] => 2
[order_hash] => b78955b1532671a85295c3bcbb56de15
[ID] => 16862
[event_id] => 4103
[event_date] => 2023-04-08 12:00:00
)
[1] => stdClass Object
(
[order_id] => 16882
[order_price] => 880
[place_amount] => 1
[order_date] => 2023-03-13 17:50:07
[order_status] => 2
[order_hash] => c2386d666225d657db4283f334d26d1a
[ID] => 16863
[event_id] => 4103
[event_date] => 2023-04-08 12:00:00
)
[3] => stdClass Object
(
[order_id] => 16882
[order_price] => 880
[place_amount] => 1
[order_date] => 2023-03-13 17:50:07
[order_status] => 1
[order_hash] => c2386d666225d657db4283f334d26d1a
[ID] => 16863
[event_id] => 4103
[event_date] => 2023-04-08 12:00:00
)
)
Сейчас под каждый статус заказа, делается отдельный sql запрос, а статусов всего 6. Думаю лучше, было бы делать один sql запрос на все заказы и потом считать их фильтруя по [order_status] => 2, но не совсем понимаю как это делать. То есть по итогу должно получится: (заказов со статусом 2: 2), (заказов со статусом 1: 1) и т.д.
Ответы (1 шт):
Автор решения: teran
→ Ссылка
получить ID статусов, сложить в массив, сделать запрос с count/группировкой и IN статусов.
$statusIds = array_column($data, 'order_status', 'order_status');
$idsStr = implode(',' , $statusIds);
$sql = "SELECT order_status, COUNT(*) AS cnt
FROM t
WHERE order_status IN ({$idsStr})";
$data = $db->query($sql);
$data = array_column($data, 'cnt', 'order_status');
print_r($data);