无限级分类

php实现无限级分类通常有两种方式:递归和引用

$array = [
    ['id' => 1, 'pid' => 0, 'name' => '广东省'],
    ['id' => 4, 'pid' => 1, 'name' => '茂名市'],
    ['id' => 6, 'pid' => 4, 'name' => '高州'],
];

实现效果:

Array
(
    [0] => Array
        (
            [id] => 1
            [pid] => 0
            [name] => 广东省
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 4
                            [pid] => 1
                            [name] => 茂名市
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 6
                                            [pid] => 4
                                            [name] => 高州
                                        )
                                )
                        )
                )
        )
)

递归实现:

function getTree($array=[], $pid =0){
    $list = [];
		if(!is_array($array){return false;}
    foreach ($array as $key => $value){
        //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
        if ($value['pid'] == $pid){
            //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
            $value['son'] = getTree($array, $value['id']);
            if ($value['children'] == null){
                unset($value['son']);
            }
            //把数组放到list中
            $list[] = $value;
            //把这个节点从数组中移除,减少后续递归消耗
            unset($array[$key]);
        }
    }
    return $list;
}

引用实现:

function getTree($arr){
			if(!is_array($arr)){return false;}
			$refer =[];
			foreach($arr as $v){
			    $refer[$v['id']] = $v;
			}
			
			$tree = [];
			foreach($refer as $v){
			    if(isset($refer[$v['pid']])){
					     $refer[$v['pid']]['children'][] = &$refer[$v['id']];
					}else{
					     $tree[] = &$refer[$v['id']];
					}
			}
			
			return $tree;
}