PHP实现无限极分类生成分类树的方法

原始数据包格式,按城市、区分类树:

$array=array(
    array('id'=>'1','name'=>'北京市','pid'=>'0'),
    array('id'=>'2','name'=>'天津市','pid'=>'0'),
    array('id'=>'3','name'=>'和平区','pid'=>'2'),
    array('id'=>'4','name'=>'海淀区','pid'=>'1'),
    array('id'=>'5','name'=>'西北旺','pid'=>'4'),
    array('id'=>'6','name'=>'马连洼','pid'=>'4'),
    array('id'=>'7','name'=>'津南区','pid'=>'2'),
);

方法一:利用递归方法,实现无限分类树

递归是实现无限极分类的最常用方法,具体方式是将所需的无限分类数据在一次循环中转化为了树形数据。该方法可在无限级别分类下的任意类别下添加子类别。

/**
 * 递归方法,实现无限分类树
 * @param array  $array    原始数据包
 * @param intval $parentId 当前分类的父级ID
 * @return array
 */
public function buildTree($array, $parentId = 0) {
    if (empty($array)) {
        return [];
    }
    $fotmatTree = array();
    foreach($array as $item) {
        if ($item['pid'] == $parentId) {
            $fotmatTree[] = array(
                'id'    => $item['id'],
                'name'  => $item['name'],
                'child' => $this->buildTree($array, $item['id']),
            );
        }
    }
    return $fotmatTree;
}

方法二:利用迭代器方法,实现无限分类树(推荐此方法,递归方法占用内存大)

该方法与递归方法类似,通常使用无限极分类数组重排的方式生成一个树形数组。由于迭代器特别适用于处理较大的数据集,因此该方法可保持代码的封装性,并且速度较快。

/**
 * 迭代器方法,实现无限分类树
 * @param array $array 原始数据包
 * @return array
 */
public function buildTree($array) {
    if (empty($array)) {
        return [];
    }
    $map = array();
    $fotmatTree = array();
    foreach ($array as &$vo) {
        $map[$vo['id']] = &$vo;
        $map[$vo['id']]['child'] = array();                    
    }
    unset($vo);

    foreach ($array as &$item) {
        $parent = &$map[$item['pid']];
        if (empty($parent)) {
            $fotmatTree[] = &$item;
        } else {
            $parent['child'][] = &$item;

        }
    }
    unset($map);
    return $fotmatTree;
}

分类树结果格式如下:

[
    {
        "id":"1",
        "name":"北京市",
        "pid":"0",
        "child":[
            {
                "id":"4",
                "name":"海淀区",
                "pid":"1",
                "child":[
                    {
                        "id":"5",
                        "name":"西北旺",
                        "pid":"4",
                        "child":[

                        ]
                    },
                    {
                        "id":"6",
                        "name":"马连洼",
                        "pid":"4",
                        "child":[

                        ]
                    }
                ]
            }
        ]
    },
    {
        "id":"2",
        "name":"天津市",
        "pid":"0",
        "child":[
            {
                "id":"3",
                "name":"和平区",
                "pid":"2",
                "child":[

                ]
            },
            {
                "id":"7",
                "name":"津南区",
                "pid":"2",
                "child":[

                ]
            }
        ]
    }
]
View Code
posted @ 2023-07-28 16:31  申文哲  阅读(195)  评论(0编辑  收藏  举报