Подсчёт количества массивов по определенным данным в php

Рейтинг: 1Ответов: 1Опубликовано: 17.03.2023

Есть массив заказов с разными их статусами:

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

получить 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);