无限级分类表结构
字段名称 | 字段类型 | 索引 | 默认值 | 备注 |
---|---|---|---|---|
id | int(11) 无符号 | 主键索引 | 自增 | id |
pid | int(11) 无符号 | 普通索引 | 0 | 父ID |
title | varchar(20) | / | 分类标题 | |
level | tinyint(3) | 普通索引 | 0 | 层级 |
sort | int(11) | 普通索引 | 0 | 排序 |
创表语句
CREATE TABLE cate(
id INT(11) UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
pid INT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父级ID',
title VARCHAR(20) NOT NULL COMMENT '标题',
`level` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '层级',
sort INT(11) NOT NULL DEFAULT 0 COMMENT '排序',
PRIMARY KEY(`id`),
INDEX(`pid`),
INDEX(`level`),
INDEX(`sort`)
)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)
*/
?>