PHP的无限极分类
PHP的无限极分类
一、使用数据表
添加from字段
id name parent_id from
1 中国 0 0
2 广东 1 0,1
3 深圳 2 0,1,2
4 龙华 3 0,1,2,3
5 湖南 1 0,1
6 长沙 5 0,1,5
7 岳麓 6 0,1,5,6
8 安微 1 0,1
9 亳州 8 0,1,8
表设计
CREATE TABLE IF NOT EXISTS jk_catelog(
id INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) NOT NULL DEFAULT '' UNIQUE COMMENT '分类名',
pid INT(10) NOT NULL DEFAULT 0 COMMENT '父id',
from VARCHAR(255) NOT NULL DEFAULT '' COMMENT '目录路径',
created INT(10) NOT NULL DEFAULT 0 COMMENT '创建时间'
)
#测试一级分类
INSERT INTO jk_catelog VALUES('','中国','0','','1490872322')
二、使用引用
<?php
$data[1] = array('id'=>'1','name'=>'一级目录A','pid'=>'0','sort'=>'1');
$data[2] = array('id'=>'2','name'=>'一级目录B','pid'=>'0','sort'=>'2');
$data[3] = array('id'=>'3','name'=>'一级目录C','pid'=>'0','sort'=>'3');
$data[4] = array('id'=>'4','name'=>'一级目录D','pid'=>'0','sort'=>'4');
$data[5] = array('id'=>'5','name'=>'二级目录A-1','pid'=>'1','sort'=>'1');
$data[6] = array('id'=>'6','name'=>'二级目录A-2','pid'=>'1','sort'=>'2');
$data[7] = array('id'=>'7','name'=>'二级目录A-3','pid'=>'1','sort'=>'3');
$data[8] = array('id'=>'8','name'=>'二级目录B-1','pid'=>'2','sort'=>'1');
$data[9] = array('id'=>'9','name'=>'二级目录B-2','pid'=>'2','sort'=>'2');
$data[10] = array('id'=>'10','name'=>'二级目录B-3','pid'=>'2','sort'=>'3');
$data[11] = array('id'=>'11','name'=>'二级目录C-1','pid'=>'3','sort'=>'2');
$data[12] = array('id'=>'12','name'=>'二级目录D-1','pid'=>'4','sort'=>'1');
$data[13] = array('id'=>'13','name'=>'二级目录D-2','pid'=>'4','sort'=>'2');
$data[14] = array('id'=>'14','name'=>'三级目录A-2-1','pid'=>'6','sort'=>'1');
$data[15] = array('id'=>'15','name'=>'三级目录A-2-2','pid'=>'6','sort'=>'2');
$data[16] = array('id'=>'16','name'=>'三级目录C-1-1','pid'=>'11','sort'=>'1');
$data[17] = array('id'=>'17','name'=>'三级目录B-2-1','pid'=>'9','sort'=>'2');
function printTree($list,$key='_child',$lever=0){
$tree = [];
foreach ($list as $id=>$value){
if( $value['pid'] == $lever ){
$tree[] = &$list[$id];
}else{
$list[$value['pid']][$key][] =&$list[$id];
}
}
return $tree;
}
$tree = printTree($data);
print_r($tree);
/*******************打印*************************/
echo "<br/><br/><br/>";
function getList($data,$level = 0)
{
$html = '';
foreach ($data as $item){
for ($i=0;$i<$level;$i++){
$html .= ' ';
}
$html .= $item['name'].'<br>';
if( isset($item['_child']) ){
$html .= getList($item['_child'],$level+1);
}
}
return $html;
}
echo getList($tree);
显示效果
一级目录A
二级目录A-1
二级目录A-2
三级目录A-2-1
三级目录A-2-2
二级目录A-3
一级目录B
二级目录B-1
二级目录B-2
三级目录B-2-1
二级目录B-3
一级目录C
二级目录C-1
三级目录C-1-1
一级目录D
二级目录D-1
二级目录D-2
三、使用递归
function make_tree($list,$pk='id',$pid='pid',$child='_child',$root=0){
$tree=array();
foreach($list as $key=> $val){
if($val[$pid]==$root){
//获取当前$pid所有子类
unset($list[$key]);
if(! empty($list)){
$child=make_tree($list,$pk,$pid,$child,$val[$pk]);
if(!empty($child)){
$val['_child']=$child;
}
}
$tree[]=$val;
}
}
return $tree;
}
$tree = make_tree($data);
print_r($tree);
四、根据id获取所有子分类
function getChildIds($list, $pid, &$ids = [], $field = 'id', $parent_field = 'pid')
{
foreach ($list as $v) {
if ($v[$parent_field] == $pid) {
$ids[] = $v[$field];
getChildIds($list, $v[$field], $ids);
}
}
return $ids;
}
五、根据子类id查找所有父类
// 递归函数,查找所有父分类ID
function findParentIds($list, $id, $field = 'id', $parentField = 'pid', $top = 0): array
{
$parentIds = [];
foreach ($list as $item) {
if ($item[$field] == $id) {
$parentId = $item[$parentField];
if ($parentId != $top) { // 如果不是顶级分类,则添加到父ID列表并继续向上查找
$parentIds[] = $parentId;
$parentIds = array_merge($parentIds, findParentIds($list, $parentId));
}
return $parentIds;
}
}
return []; // 如果未找到任何父分类,则返回空数组
}
print_r(findParentIds($data,16));