基于php无限分类的深入理解


Posted in PHP onJune 02, 2013

无限分类是实际开发中经常用到的一种数据结构,一般我们称之为树形结构。
题设:类似淘宝的商品分类,可以在任意分类设置其子类。
 
一、创建`type`数据表
`id` 自增长
`fid` int(11) 默认(0) ,父节点id
`name` varchar(50),分类名称

CREATE TABLE `type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fid` int(11) NOT NULL DEFAULT '0',
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
)

二、添加
我们先添加几个顶级分类
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '手机');
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '电脑');
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '鞋子');
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '衣服');

这里fid=0是代表顶级分类

接着我们为{电脑}添加几个个子分类

INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '2', '台式'), (NULL, '2', '笔记本');

这里fid=2,2这个id是分类{电脑}的id,如果是添加{鞋子}的子分类则fid=3
同理我们为{笔记本}添加子分类则fid=6
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '6', 'ausu'), (NULL, '6', 'hp');

三、删除
如果我们想删除{笔记本}这个分类,很简单
DELETE FROM `type` WHERE `id`=6

{笔记本}的子分类我们也要记得做相应的处理
function del($fid) {
    $sql="SELECT * FROM `type` WHERE `fid`=$fid";
    $rs=mysql_query($sql);    for ($i = 0; $i < count($rs); $i++) {
        $sql="DELETE FROM `type` WHERE `id`={$rs[$i]['id']}";
        mysql_query($sql);
        del($rs['id']);//递归
    }
}
del(6);//执行操作

这里你也许你会疑惑为什么那么麻烦用递归,而不是直接这样删除
DELETE FROM `type` WHERE `fid`=6

这样我们不就可以直接删除{ausu}、{hp}?但是假设{ausu}有一个子分类{a1},{a1}也有一个子分类{a2},如果不用递归我们就无法彻底删除数据。

三、查找
1.查找{电脑}的子分类

SELECT * FROM `type` WHERE `fid`=2

2.查找{电脑}的所有子分类
function sel($fid) {
    $sql="SELECT * FROM `type` WHERE `fid`=$fid";
    $rs=mysql_query($sql);    for ($i = 0; $i < count($rs); $i++) {
        echo $rs[$i]['name'];
        sel($rs[$i]['id']);//递归
    }
}
sel(2);

四、实际数据应用
在数据表添加一个字段`tid`,字段值为记录所属分类`type`表的id。必须是id不能是name,因为name的值可能会改变。
例如查询属于{电脑}分类的商品
SELECT * FROM `goods` WHERE `tid`=2

注:代码没有运行过可能会有错误,但是思路是正确的,主要的是理解树形结构,而不是记住代码。
PHP 相关文章推荐
用PHP的ob_start() 控制您的浏览器cache
Aug 03 PHP
提高PHP编程效率 引入缓存机制提升性能
Feb 15 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
php获取远程图片体积大小的实例
Nov 12 PHP
设置php页面编码的两种方法示例介绍
Mar 03 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
PHP中上传多个文件的表单设计例子
Nov 19 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
详解PHP素材图片上传、下载功能
Apr 12 PHP
php引用传递
Apr 01 PHP
php curl的深入解析
Jun 02 #PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 #PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 #PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
Jun 01 #PHP
php源代码安装常见错误与解决办法分享
May 28 #PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 #PHP
php 深入理解strtotime函数的使用详解
May 23 #PHP
You might like
php的ZipArchive类用法实例
2014/10/20 PHP
php中chdir()函数用法实例
2014/11/13 PHP
php中session与cookie的比较
2015/01/27 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
在网页里看flash的trace数据的js类
2009/01/10 Javascript
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
小程序云开发实战小结
2018/10/25 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
python-地图可视化组件folium的操作
2020/12/14 Python
pandas 数据类型转换的实现
2020/12/29 Python
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
工地例会施工汇报材料
2014/08/22 职场文书
购房个人委托书范本
2014/10/11 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
2014年商场工作总结
2014/11/22 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书