基于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 相关文章推荐
基于mysql的论坛(3)
Oct 09 PHP
php 输出双引号&quot;与单引号'的方法
May 09 PHP
PHP用SAX解析XML的实现代码与问题分析
Aug 22 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
Jan 03 PHP
PHP中余数、取余的妙用
Jun 29 PHP
深入探究PHP的多进程编程方法
Aug 18 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
Mar 14 PHP
PHP abstract 抽象类定义与用法示例
May 29 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
PHP合并两个或多个数组的方法
Jan 20 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经典的给图片加水印程序
2006/12/06 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
浅析Python的Django框架中的Memcached
2015/07/23 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
python动态视频下载器的实现方法
2019/09/16 Python
python中return的返回和执行实例
2019/12/24 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
若干个Java基础面试题
2015/05/19 面试题
证婚人经典证婚词
2014/01/09 职场文书
大学运动会通讯稿
2014/01/28 职场文书
阅兵口号
2014/06/19 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
幼师小班个人总结
2015/02/12 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书