如何计算多维数组中的特定键值?

时间:2019-09-26 07:19:49

标签: php arrays recursion multidimensional-array counting

我有一个以树形结构列出的供应商数据数组,每个供应商都有一个类型。

这些是供应商及其ID的类型:

  • 代理商= 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 :(得分:0)

将有许多技术来递归处理树数据。我将提供本机函数样式和自定义递归样式。

array_walk_recursive()访问所有“叶子节点”,因此您只需要检查键并将值推入一个可以在该函数范围之外访问的变量,这就是为什么“按引用修改” “至关重要。

代码:(Demo

// 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,
)