基于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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
Oct 31 PHP
php 伪造本地文件包含漏洞的代码
Nov 03 PHP
header中Content-Disposition的作用与使用方法
Jun 13 PHP
PHP 类相关函数的使用详解
May 10 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
php支付宝在线支付接口开发教程
Sep 19 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
Mar 14 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
Laravel 实现密码重置功能
Feb 23 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绘图中显示不出图片的原因及解决
2014/03/05 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
php批量删除操作代码分享
2017/02/26 PHP
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
Python字符遍历的艺术
2008/09/06 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
python cumsum函数的具体使用
2019/07/29 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
pyqt5中动画的使用详解
2020/04/01 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
反洗钱宣传活动总结
2014/08/26 职场文书
高中学生自我评价范文
2014/09/23 职场文书
公司离职证明标准范本
2014/10/05 职场文书
华山导游词
2015/02/03 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
员工工作心得体会
2019/05/07 职场文书
详解Python函数print用法
2021/06/18 Python
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle