基于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编写大型网站问题集
Mar 06 PHP
Linux下进行MYSQL编程时插入中文乱码的解决方案
Mar 15 PHP
php下一个阿拉伯数字转中文数字的函数
Jul 16 PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
PHP中字符串长度的截取用法示例
Jan 12 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 PHP
PHP中PDO事务处理操作示例
May 02 PHP
Yii1.1框架实现PHP极光推送消息通知功能
Sep 06 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 PHP
php7 错误处理机制修改实例分析
May 25 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实现最简单的MVC框架实例教程
2014/09/08 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
javascript 图片裁剪技巧解读
2012/11/15 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
python实现linux下使用xcopy的方法
2015/06/28 Python
Python通过属性手段实现只允许调用一次的示例讲解
2018/04/21 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
python怎么判断素数
2020/07/01 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
Linux文件系统类型
2012/02/15 面试题
教师求职信范文
2014/05/24 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
丽江古城导游词
2015/02/03 职场文书
员工福利申请报告
2015/05/15 职场文书
红色经典观后感
2015/06/18 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
pytorch MSELoss计算平均的实现方法
2021/05/12 Python