php非递归实现无限极分类
一、数组
$categories = array( array('id'=>1,'name'=>'陕西','parent_id'=>0), array('id'=>2,'name'=>'西安','parent_id'=>1), array('id'=>3,'name'=>'长安区','parent_id'=>2), array('id'=>4,'name'=>'河南','parent_id'=>0), array('id'=>5,'name'=>'郑州','parent_id'=>4), array('id'=>6,'name'=>'河北','parent_id'=>0), array('id'=>7,'name'=>'石家庄','parent_id'=>6), array('id'=>8,'name'=>'新华区','parent_id'=>7));
二、非递归实现无限极分类
function getTree1($categories) { //第一步,将分类id作为数组key,并创建node单元 $tree = array(); foreach($categories as $category){ $tree[$category['id']] = $category; $tree[$category['id']]['node'] = array(); } //第二步,利用引用,将每个分类添加到父类node数组中,这样一次遍历即可形成树形结构。 foreach($tree as $key=>$item){ if($item['parent_id'] != 0){ $tree[$item['parent_id']]['node'][] = &$tree[$key];//注意:此处必须传引用否则结果不对 if(empty($tree[$key]['node'])){ unset($tree[$key]['node']); //如果node为空,则删除该node元素 } } } //第三步,删除无用的非根节点数据 foreach($tree as $key=>$category){ if($category['parent_id'] != 0){ unset($tree[$key]); } if(empty($tree[$key]['node'])){ unset($tree[$key]['node']); //如果node为空,则删除该node元素 } } //echo "<pre>"; print_r($tree);die; return array_values($tree);//改变数组的key从0开始 } function getTree2($array, $parent_key = 'parent_id', $key = 'id', $children = 'node') { $res = []; foreach ($array as $value) { isset($res[$value[$parent_key]]) ?: $res[$value[$parent_key]] = []; isset($res[$value[$key]]) ?: $res[$value[$key]] = []; //这里判断 删除空的数组 if(in_array($value[$key], array_column($array, $parent_key))){ $end=array_merge($value, [$children => &$res[$value[$key]]]); }else{ $end=$value; } $res[$value[$parent_key]][] = $end; } return $res[0]; }
三、效果 注意:getTree1和getTree2的结果是一样的,可以任意选一种
Array
(
[1] => Array
(
[id] => 1
[name] => 陕西
[parent_id] => 0
[node] => Array
(
[0] => Array
(
[id] => 2
[name] => 西安
[parent_id] => 1
[node] => Array
(
[0] => Array
(
[id] => 3
[name] => 长安区
[parent_id] => 2
)
)
)
)
)
[4] => Array
(
[id] => 4
[name] => 河南
[parent_id] => 0
[node] => Array
(
[0] => Array
(
[id] => 5
[name] => 郑州
[parent_id] => 4
)
)
)
[6] => Array
(
[id] => 6
[name] => 河北
[parent_id] => 0
[node] => Array
(
[0] => Array
(
[id] => 7
[name] => 石家庄
[parent_id] => 6
[node] => Array
(
[0] => Array
(
[id] => 8
[name] => 新华区
[parent_id] => 7
)
)
)
)
)
)
代码改变世界!