上一篇文章中写了一个无限级分类,当时代码是借鉴别人的代码,没有仔细看运行结果,大体上实现了这个功能,但是因为缺少了层级 level
,直接使用pid
字段来控制缩进出现了一些问题。这次重新修改了代码和表结构,增加了 level
和sort
字段,同时附上了创表语句。
无限级分类表结构
字段名称 | 字段类型 | 索引 | 默认值 | 备注 |
---|---|---|---|---|
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,sort';
$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)
*/
?>
原文始发于微信公众号(两双筷子):无限级分类,这次写对了。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/78513.html