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 .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
        }
        $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));
posted @ 2020-07-01 23:19  成文的博客  阅读(253)  评论(0编辑  收藏  举报