顶级分类下面有子分类,子分类下面又有孙分类,子子孙孙无穷尽也。
怎么让这个分类功能支持无限个,说是无限,其实也是有限。算法可以无限,实际使用中总是有限,毕竟计算机的内存是有限的。
无限分类实现如下:
<?php
function tree_list($list,$p_id = 0,$p_field='p_id'){
//用于保存整理好的分类节点
$tree = [];
// 循环所有分类
foreach ($list as $key => $value) {
// 如果当前分类的父id等于要寻找的父id则写入$tree 数组,并寻找当前分类id下的所有子分类
if($p_id == $value[$p_field]) {
$tree [$key] = $value;
$tree [$key] ['children'] = tree_list($list,$value ['id'],$p_field);
}
}
return $tree;
}
//假如这是数据库查出来的
$test_list=[
['id'=>1,'p_id'=>0,'name'=>'分类1'],
['id'=>2,'p_id'=>0,'name'=>'分类1'],//顶级分类
['id'=>3,'p_id'=>0,'name'=>'分类2'],//顶级分类
['id'=>4,'p_id'=>0,'name'=>'分类3'],//顶级分类
['id'=>5,'p_id'=>1,'name'=>'分类8(子)'],//子级分类
['id'=>6,'p_id'=>5,'name'=>'分类9(孙)'],//孙级分类
['id'=>7,'p_id'=>6,'name'=>'分类10(曾孙)'],//曾孙级分类
];
$tree_list=tree_list($test_list,$p_id = 0,$p_field='p_id');
print_r($tree_list);
输出:
Array
(
[0] => Array
(
[id] => 1
[p_id] => 0
[name] => 分类1
[children] => Array
(
[4] => Array
(
[id] => 5
[p_id] => 1
[name] => 分类8(子)
[children] => Array
(
[5] => Array
(
[id] => 6
[p_id] => 5
[name] => 分类9(孙)
[children] => Array
(
[6] => Array
(
[id] => 7
[p_id] => 6
[name] => 分类10(曾孙)
[children] => Array
(
)
)
)
)
)
)
)
)
[1] => Array
(
[id] => 2
[p_id] => 0
[name] => 分类1
[children] => Array
(
)
)
[2] => Array
(
[id] => 3
[p_id] => 0
[name] => 分类2
[children] => Array
(
)
)
[3] => Array
(
[id] => 4
[p_id] => 0
[name] => 分类3
[children] => Array
(
)
)
)
完美~