Как посчитать конкретные значения ключа из многомерного массива? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть массив данных поставщика, указанный в виде древовидной структуры, и у каждого поставщика есть тип.

Это типы поставщиков и его идентификатор:

  • Агентство = 1
  • Филиал = 2
  • Продавец = 3
  • Smartshop = 4

Пример: ['type']=>2 (здесь этот поставщик является филиалом).

Мой вопрос: как я могу получить количество филиалов в этом массиве, такое же количество оптовиков и смарт-магазинов?

Желаемый результат:

[2 => 2, 3 => 2, 4 => 1]

Вот мой динамический сгенерированный массив:

Array
(
    [2] => Array
        (
            [id] => 2
            [type] => 2
            [name] => R-1 Agency
            [parent] => 1
            [children] => Array
                (
                    [3] => Array
                        (
                            [id] => 3
                            [type] => 3
                            [name] => R-1-W-1
                            [parent] => 2
                            [children] => Array
                                (
                                    [11] => Array
                                        (
                                            [id] => 11
                                            [type] => 4
                                            [name] => mdf,lk
                                            [parent] => 3
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

    [38] => Array
        (
            [id] => 38
            [type] => 2
            [name] => sndflk
            [parent] => 1
            [children] => Array
                (
                    [40] => Array
                        (
                            [id] => 40
                            [type] => 3
                            [name] => new one
                            [parent] => 38
                            [children] => Array
                                (
                                )

                        )

                )

        )

)

Я использовал эту функцию:

function take_types($array){
    foreach ($array as $key => $value) {
        $types[] = $value['type'];
        if(!empty($value['children'])){
            $this->take_types($value['children']);
        }
    }
    return $types;
}

КогдаЯ использую вышеупомянутую функцию, вывод выглядит так:

Array
(
    [0] => 2
    [1] => 2
)

Я получаю только два значения, мне нужно получить счетчик каждого типа поставщика.

1 Ответ

0 голосов
/ 27 сентября 2019

Будет много методов для рекурсивной обработки данных вашего дерева.Я предложу собственный стиль функции и собственный рекурсивный стиль.

array_walk_recursive() посещает все «конечные узлы», так что вам нужно только проверить ключ и вставить значение в переменную, которая может бытьдоступ вне области действия этой функции - вот почему «изменение по ссылке» жизненно важно.

Код: ( Демо )

// I removed the chunky $tree declaration from my post, see the demo
$result = [];
array_walk_recursive(
    $tree,
    function($v, $k) use (&$result) {
        if ($k === 'type') {
            $result[] = $v;
        }
    }
);
var_export(array_count_values($result));

Или

function recursiveTypeCount($array, $output = []) {
    foreach($array as $item) {
        if (!isset($output[$item['type']])) {
            $output[$item['type']] = 1;
        } else {
            ++$output[$item['type']];
        }
        if ($item['children']) {
            $output = recursiveTypeCount($item['children'], $output);
        }
    }
    return $output;
}

var_export(recursiveTypeCount($tree));

Оба отобразят:

array (
  2 => 2,
  3 => 2,
  4 => 1,
)
...