
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;
}




近期评论