php 递归无限级分类 非递归无限级分类

实际项目开发,经常碰到无限级分类、三级省市区联动。

有数据如下:

$areas = [
    ['id' => 110000, 'name' => '北京市', 'pid' => 0],
    ['id' => 310000, 'name' => '上海市', 'pid' => 0],
    ['id' => 440000, 'name' => '广东省', 'pid' => 0],
    ['id' => 110100, 'name' => '北京市区', 'pid' => 110000],
    ['id' => 110101, 'name' => '东城区', 'pid' => 110100],
    ['id' => 110105, 'name' => '朝阳区', 'pid' => 110100],
    ['id' => 310100, 'name' => '上海市', 'pid' => 310000],
    ['id' => 310101, 'name' => '黄浦区', 'pid' => 310000],
    ['id' => 310115, 'name' => '浦东新区', 'pid' => 310000],
    ['id' => 440100, 'name' => '广州市', 'pid' => 440000],
    ['id' => 440600, 'name' => '佛山市', 'pid' => 440000],
    ['id' => 440104, 'name' => '越秀区', 'pid' => 440100],
    ['id' => 440106, 'name' => '天河区', 'pid' => 440100],
    ['id' => 440606, 'name' => '顺德区', 'pid' => 440600],
    ['id' => 440605, 'name' => '南海区', 'pid' => 440600],
];

递归实现方式:

function getTree($items,$pid){
    $tree = array();
    foreach ($items as $value) {
        if ($value['pid'] == $pid) {
            $value['child'] = getTree($items, $value['id']);
            if (!$value['child']) {
                unset($value['child']); //如果child为空,则删除该children元素(可选)
            }
            $tree[] = $value;
        }
    }
    return $tree;
}
print_r(getTree($areas,0));

 

 

非递归(数组引用)实现


function getTree($items){
    // 索引数组转成键值对的形式
    $arr = [];
    foreach ($items as $val) {
        $arr[$val['id']] = $val;
    }

    $tree = array();
    foreach ($arr as $item) {
        if (isset($arr[$item['pid']])) {
            $arr[$item['pid']]['child'][] = &$arr[$item['id']];
        } else {
            $tree[] = &$arr[$item['id']];
        }
    }
    return $tree;
}
print_r(getTree($areas));

 

 

Array
(
    [0] => Array
        (
            [id] => 110000
            [name] => 北京市
            [pid] => 0
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 110100
                            [name] => 北京市区
                            [pid] => 110000
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 110101
                                            [name] => 东城区
                                            [pid] => 110100
                                        )

                                    [1] => Array
                                        (
                                            [id] => 110105
                                            [name] => 朝阳区
                                            [pid] => 110100
                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 310000
            [name] => 上海市
            [pid] => 0
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 310100
                            [name] => 上海市
                            [pid] => 310000
                        )

                    [1] => Array
                        (
                            [id] => 310101
                            [name] => 黄浦区
                            [pid] => 310000
                        )

                    [2] => Array
                        (
                            [id] => 310115
                            [name] => 浦东新区
                            [pid] => 310000
                        )

                )

        )

    [2] => Array
        (
            [id] => 440000
            [name] => 广东省
            [pid] => 0
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 440100
                            [name] => 广州市
                            [pid] => 440000
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 440104
                                            [name] => 越秀区
                                            [pid] => 440100
                                        )

                                    [1] => Array
                                        (
                                            [id] => 440106
                                            [name] => 天河区
                                            [pid] => 440100
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 440600
                            [name] => 佛山市
                            [pid] => 440000
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 440606
                                            [name] => 顺德区
                                            [pid] => 440600
                                        )

                                    [1] => Array
                                        (
                                            [id] => 440605
                                            [name] => 南海区
                                            [pid] => 440600
                                        )

                                )

                        )

                )

        )

)

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值