基于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(2)
Oct 09 PHP
用PHP实现验证码功能
Oct 09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――上篇)
Dec 13 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 PHP
php 模拟POST提交的2种方法详解
Jun 17 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
php去除头尾空格的2种方法
Mar 16 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
Dec 14 PHP
ThinkPHP连接Oracle数据库
Apr 22 PHP
php数组冒泡排序算法实例
May 06 PHP
PHP基于openssl实现非对称加密代码实例
Jun 19 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统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
php获取url参数方法总结
2014/11/13 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
[04:39]显微镜下的DOTA2第十三期—Pis卡尔个人秀
2014/04/04 DOTA
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
[01:00:44]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第三局
2016/03/04 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
python元组操作实例解析
2014/09/23 Python
Python if语句知识点用法总结
2018/06/10 Python
使用python实现快速搭建简易的FTP服务器
2018/09/12 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python 类之间的参数传递方式
2019/12/20 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
通信工程毕业生自荐信
2013/11/01 职场文书
个人求职简历中英文自我评价
2013/12/16 职场文书
高中毕业自我鉴定
2013/12/16 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
4s店活动策划方案
2014/08/25 职场文书
学前班学生评语
2014/12/29 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL
Go 内联优化让程序员爱不释手
2022/06/21 Golang