基于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实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
Nov 22 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
微信开发之网页授权获取用户信息(二)
Jan 08 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
PHP实现权限管理功能示例
Sep 22 PHP
Django中通过定时任务触发页面静态化的处理方式
Aug 29 PHP
PHP命名空间定义与用法实例分析
Aug 14 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 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简单浏览目录内容的实现代码
2013/06/07 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
PHP对象实例化单例方法
2017/01/19 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
node.js 如何监视文件变化
2020/09/01 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
Python高级特性 切片 迭代解析
2019/08/23 Python
基于Python实现扑克牌面试题
2019/12/11 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
html5借用repeating-linear-gradient实现一把刻度尺(ruler)
2019/09/09 HTML / CSS
中药专业大学生医药工作求职信
2013/10/25 职场文书
党员干部公开承诺书
2014/03/26 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
测绘工程专业求职信
2014/07/15 职场文书
员工辞退通知书
2015/04/17 职场文书
2015秋季开学典礼新闻稿
2015/07/17 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB