基于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设计模式中的工厂模式
Jun 12 PHP
php面向对象全攻略 (一) 面向对象基础知识
Sep 30 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
Jan 17 PHP
php生成局部唯一识别码LUID的代码
Oct 06 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
php使用str_replace实现输入框回车替换br的方法
Nov 24 PHP
thinkphp模板的包含与渲染实例分析
Nov 26 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 PHP
PHP下的浮点运算不准的解决方法
Oct 27 PHP
Yii框架数据模型的验证规则rules()被执行的方法
Dec 02 PHP
PHP从数组中删除元素的四种方法实例
May 12 PHP
php xhprof使用实例详解
Apr 15 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
一篇入门的php Class 文章
2007/04/04 PHP
PHP 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
js调用flash的效果代码
2008/04/26 Javascript
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
解析Python编程中的包结构
2015/10/25 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
鲜花方阵解说词
2014/02/13 职场文书
法人任命书范本
2014/06/04 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
给上级领导的感谢信
2015/01/22 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js