Как посчитать значения многомерных массивов, принадлежащих определенному ключу? - PullRequest
3 голосов
/ 15 февраля 2020

У меня ниже массива;

Array
(
    [2019-11-01] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 1
                    [category] => cat1
                )
        [1] => stdClass Object
            (
                [id] => 2
                [category] => cat2
            )

        [2] => stdClass Object
            (
                [id] => 3
                [category] => cat1
            )

        [3] => stdClass Object
            (
                [id] => 4
                [category] => cat2
            )

        [4] => stdClass Object
            (
                [id] => 5
                [category] => cat1
            )

        [5] => stdClass Object
            (
                [id] => 6
                [category] => cat2
            )

    )

[2019-11-03] => Array
    (
        [0] => stdClass Object
            (
                [id] => 7
                [category] => cat1
            )

    )

)

И я хочу узнать статистику по категориям.

вроде:

количество cat1: 4

cat2 count: 3

Я могу получить результат для cat1 с кодом, который я использую ниже:

$cat1count = 0;

foreach ($myArray as $date => $content) {

    foreach ($content as $value) {
        if ($value->category == "cat1") {
            $cat1count++;
        }
    }
}

echo "Cat1 count:".$cat1count;
#Outputs: Cat1 count:4

Но мне интересно,

как получить те же результаты без жесткого кодирования имени категории, как я делал выше "cat1"

и для каждой категории (cat1, cat2)?

Заранее спасибо!

1 Ответ

3 голосов
/ 15 февраля 2020

Вы можете использовать комбинацию array_column() для извлечения значений категории из данных, а затем использовать array_count_values() для подсчета количества в каждой дате.

Этот код просто отображает дату, а затем количество значений ...

foreach ( $myArray as $date => $content) {
    $categories = array_column($content, "category");
    echo $date.PHP_EOL;
    print_r(array_count_values($categories));
}

Если вам нужны итоги по всем датам, просто добавьте их в массив итогов ...

$totals = [];
foreach ( $myArray as $date => $content) {
    $categories = array_column($content, "category");
    foreach (array_count_values($categories) as $category => $count )  {
        $totals[$category] = ($totals[$category]??0) + $count;
    }
}
...