基于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下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
php实现自动获取生成文章主题关键词功能的深入分析
Jun 03 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
带密匙的php加密解密示例分享
Jan 29 PHP
php计算函数执行时间的方法
Mar 20 PHP
php输出指定时间以前时间格式的方法
Mar 21 PHP
php获取百度收录、百度热词及百度快照的方法
Apr 02 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
Jul 07 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
yii2的restful api路由实例详解
May 14 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循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
python读取word文档的方法
2015/05/09 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
python实现按首字母分类查找功能
2019/10/31 Python
什么是python的列表推导式
2020/05/26 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
英国门把手公司:Door Handle Company
2019/05/12 全球购物
名词解释型面试题(主要是网络)
2013/12/27 面试题
有关环保的标语
2014/06/13 职场文书
党员转正党支部意见
2015/06/02 职场文书
厉行节约工作总结
2015/08/12 职场文书
合作合同协议书
2016/03/21 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis