基于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 相关文章推荐
使用 eAccelerator加速PHP代码的方法
Sep 30 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
Feb 08 PHP
PHP zlib扩展实现页面GZIP压缩输出
Jun 17 PHP
Apache服务器无法使用的解决方法
May 08 PHP
php中magic_quotes_gpc对unserialize的影响分析
Dec 16 PHP
详解PHP+AJAX无刷新分页实现方法
Nov 03 PHP
深入浅析php json 格式控制
Dec 24 PHP
Zend Framework框架中实现Ajax的方法示例
Jun 27 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP中__set()实例用法和基础讲解
Jul 23 PHP
php日志函数error_log用法实例分析
Sep 23 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 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
杏林同学录(六)
2006/10/09 PHP
PHP面向对象精要总结
2014/11/07 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
jQuery中parents()方法用法实例
2015/01/07 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
讲解vue-router之什么是动态路由
2018/05/28 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
python提取页面内url列表的方法
2015/05/25 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
Linux的主要特性
2014/10/06 面试题
渔夫的故事教学反思
2014/02/14 职场文书
工业设计专业自荐书
2014/06/05 职场文书
分公司任命书
2014/06/06 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
英语投诉信范文
2015/07/03 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
PHP使用非对称加密算法RSA
2021/04/21 PHP
让文件路径提取变得更简单的Python Path库
2021/05/27 Python