无限级分类表结构

    字段名称 字段类型 索引 默认值 备注
    id int(11) 无符号 主键索引 自增 id
    pid int(11) 无符号 普通索引 0 父ID
    title varchar(20) / 分类标题
    level tinyint(3) 普通索引 0 层级
    sort int(11) 普通索引 0 排序

    创表语句

    1. CREATE TABLE cate(
    2. id INT(11) UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
    3. pid INT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父级ID',
    4. title VARCHAR(20) NOT NULL COMMENT '标题',
    5. `level` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '层级',
    6. sort INT(11) NOT NULL DEFAULT 0 COMMENT '排序',
    7. PRIMARY KEY(`id`),
    8. INDEX(`pid`),
    9. INDEX(`level`),
    10. INDEX(`sort`)
    11. )ENGINE=innodb DEFAULT CHARSET=utf8 COMMENT='分类表';

    PHP代码

    <?php
        $dsn="mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4;";
        $pdo=new PDO($dsn,'root','root');
        $sql='SELECT * FROM `cate` Order BY pid,`order`';
        $result=$pdo->query($sql,PDO::FETCH_OBJ);
        $categories =[];
        // 循环数据库 按照父ID拼
        foreach($result as $value){
            $categories[$value->pid][]=$value;
        }
    
        $tree=[];
        // 拼接树形结构
        function catetree($categories,$n){
            global $tree;
            static $num=0;
            // 如果由子类再循环
            if(isset($categories[$n])){
                foreach($categories[$n] as $category){
                    // 几层就输出几个
                    $tree[] = str_repeat(' ',$category->level).'├─'.$category->title;
                    $num++;
                    catetree($categories,$category->id);
                }
            }
        }
        // 调用函数
        catetree($categories,0);
        // 输出结果
        var_dump($tree);
    
        /*
            array (size=10)
              0 => string '├─新闻' (length=12)
              1 => string ' ├─国内新闻' (length=19)
              2 => string '  ├─北京新闻' (length=20)
              3 => string ' ├─国际新闻' (length=19)
              4 => string '  ├─美国新闻' (length=20)
              5 => string '├─图片' (length=12)
              6 => string ' ├─美女图片' (length=19)
              7 => string '   ├─日韩明星' (length=21)
              8 => string '    ├─日本电影' (length=22)
              9 => string ' ├─风景图片' (length=19)
        */
    ?>