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
)
)
)
)
)
)
代码改变世界!

浙公网安备 33010602011771号