




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PHP无限级分类算法原理及实例演示1、原理:什么是无限分类呢?就像windows下新建一个文件夹,在新建的文件夹下又可以新建 一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分 出它子类,子类又 可以分出它的子类,这样一直无限循环下去。 那PHP又是如何实现它的无限分类的呢?如何把它的各个分类一一列出来呢? 首先我们假设有这样的一个三级分类,新闻PHP新闻PHP6.0出来了。 如果我们要查找“PHP6.0出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻 就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反 过来我们只要 知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设 计一个父类id的字段就可以实现无限分类的功能了。 view plaincopy to clipboardprint? /我们建一个表class CREATE TABLE class ( id int(11) NOT NULL auto_increment COMMENT 分类id, f_id int(11) NOT NULL COMMENT 父id, name varchar(25) collate gbk_bin NOT NULL COMMENT 分类名称, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=gbk COLLATE=gbk_bin AUTO_INCREMENT=1 ; /首先我们往数据库里插入新闻这个大分类,因为新闻是最大分类,上面没有父类了,所以我把它的f_id设置为0。 INSERT INTO class (id, f_id, name) VALUES(1, 0, 新闻); /id这个字段是自动增长的,可以不写值。 /然后我们再往数据库里插入PHP新闻这个分类,它的父类新闻的id是1,所以它的f_id设置为1。 INSERT INTO class (id, f_id, name) VALUES(2, 1, PHP新闻); /然后我们再往数据库里插入PHP6.0出来了这个分类,它的父类PHP新闻的id是2,所以它的f_id设置为2。 INSERT INTO class (id, f_id, name) VALUES(3, 2, PHP6.0出来了); /同理,我们可以这样一直往下插入分类,也就达到了无限分类。 /我们可以发现插入一个分类的原则关键是找到这个分类的父类的id,然后作为这个分类的f_id字段的值。 /假设要插入跟新闻同一个级别的分类技术,也就是说它也是最大分类,上面没有父类了,那么它的f_id也设置为0; INSERT INTO class (id, f_id, name) VALUES(4, 0, 技术); /在技术下面又有一个分类PHP技术,那么我们怎么插入呢,首先找到PHP技术的父类技术的id,然后作为自己的f_id字段的值。 INSERT INTO class (id, f_id, name) VALUES(5, 4, PHP技术); /看到这里,想必大家应该都明白怎么往数据库里插入各个分类了。就不再举例了。 我们已经知道如何往数据库里插入各个分类了,那又如何把各个分类罗列出来呢? view plaincopy to clipboardprint? query(set names utf8); $result=$db-query(select name from class where f_id=0); /查找f_id=0的分类,也就是查找每一个大类。 while($row=$result-fetch_assoc() echo $rowname. ; /这样就把每个大类循环出来了。 /同样我们可以把新闻的子类循环出来。 $result=$db-query(select * from class where f_id=1); /查找f_id=1的分类,也就是查找新闻的子类。 while($row=$result-fetch_assoc() echo $rowname. ; /这样就把新闻的子类循环出来了。注意:只是子类,不包括孙子类。 /写到这里,我们会发现一个问题,如果这个分类是10级分类,难道我们要写10个循环把它每个子类循环出来?如果是更多级分类呢,这样写显然是不现实的。 /那又有什么办法解决呢?我们可以写一个递归的函数,把f_id作为参数传入,不断循环每一个f_id的值,也就是说把每一个f_id值的子类循环出来。 /首先我们把各个分类的值保存在一个二维数组中,在下面的递归函数里有用。 $result=$db-query(select * from class); while($row=$result-fetch_assoc() $arr=array($rowid,$rowf_id,$rowname); /每一行保存一个分类的id,f_id,name的信息。 function fenlei($f_id=0) /$f_id初始化为0,也就是从最大分类开始循环. global $arr; /声明$arr为全局变量才可在函数里引用。 for($i=0;$i代码演示:query( $sql ); while ($rows = $DB-fetch_array($result) $category_array$rowscategoryParentID$rowscategoryID = array(id = $rowscategoryID, parent = $rowscategoryParentID, name = $rowscategoryName); if (!isset($category_array$category_id) return ; foreach($category_array$category_id AS $key = $category) if ($categoryid = $default_category) echo option selected value=.$categoryid.; else echo 0) echo . str_repeat( , $level ) . . $categoryname . n; else echo . $categoryname . n; Get_Category($key, $level + 1, $default_category); unset($category_array$category_id);/*函数返回的数组格式如下所示:Array ( 1 = Array ( id = 1 name = 一级类别 level = 0 ParentID = 0 ) 4 = Array ( id = 4 name = 二级类别 level = 1 ParentID = 1 ) 9 = Array ( id = 9 name = 哈哈 level = 2 ParentID = 4 ) 3 = Array ( id = 3 name = 二级类别 level = 1 ParentID = 1 ) 8 = Array ( id = 8 name = aqqqqqd level = 2 ParentID = 3 ) 2 = Array ( id = 2 name = 二级类别 level = 1 ParentID = 1 ) 7 = Array ( id = 7 name = 234234 level = 2 ParentID = 2 ) 6 = Array ( id = 6 name = 333332 level = 2 ParentID = 2 ) 5 = Array ( id = 5 name = 三级类别 level = 2 ParentID = 2 ) 10 = Array ( id = 10 name = 66333666 level = 3 ParentID = 5 ) )*/指定分类id,然后返回数组function Category_array($category_id = 0,$level=0) global $DB; $sql = SELECT * FROM category ORDER BY categoryID DESC; $result = $DB-query($sql); while ($rows = $DB-fetch_array($result) $category_array$rowscategoryParentID$rowscategoryID = $rows; foreach ($category_array AS $key=$val) if ($key = $category_id) foreach ($val AS $k= $v) $options$k = array( id = $vcategoryID, name = $vcategoryName, level = $level, ParentID=$vcategoryParentID ); $children = Category_array($k, $level+1); if (count($children) 0) $options = $options + $children; unset($category_array$category_id); return $options;? array( 1 = array(id = 1, parent = 0, name = 1111), 2 = array(id = 2, parent = 0, name = 2222), 4 = array(id = 4, parent = 0, name = 4444) ), 1 = array( 3 = array(id = 3, parent = 1, name = 333333), 5 = array(id = 5, parent = 1, name = 555555) ), 3 = array( 6 = array(id = 6, parent = 3, name = 66666), 7 = array(id = 7, parent = 3, name = 77777) ), 4 = array( 8 = array(id = 8, parent = 4, name = 8888), 9 = array(id = 9, parent = 4, name = 9999) ) ); if (!isset($arr$category_id) return ; foreach($arr$category_id AS $key = $cate) if ($cateid = $default_category) $txt = option selected value=.$cateid.; else $txt = 0) $txt1 = . str_repeat( -, $level ) . . $catename . n; else $txt1 = . $catename . n; $val = $txt.$txt1; echo $val; self:Get_Category($key, $level + 1, $default_category); function getFlush($category_id = 0,$level =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 鄂州合同范本哪家好
- 2025广东湛江廉江市第四批兜底安置类公益性岗位招聘4人笔试备考试题及答案解析
- 2025广东江门中医药职业学院招聘教师和辅导员11人(编制)笔试备考试题及答案解析
- 2025福建南平市属校紧缺急需学科教师招聘16人(二)笔试备考试题及答案解析
- 2025福建泉州市部分公办学校招聘编制内新任教师6人(五)备考试题及答案解析
- 工厂入工合同范本
- 直播投放合同范本
- 保险合同范本模板
- 农业科技园区开发合同
- 报废货车销售合同范本
- GB 35574-2017热电联产单位产品能源消耗限额
- 催化重整装置大赛题库(技师、高级技师)
- 植物生物技术绪论
- 机器视觉课件
- 意外伤害急救常识及绷带包扎法课件
- 硫酸法钛白生产工艺操作规程
- 客舱广播词的基本知识
- 金坛区苏科版五年级上册劳动《10木笔筒》课件
- 天然药物分离和提纯天然产物化学资料绪论
- 柴油供货合同范本模板
- 陈琴《经典素读课程分层教学》
评论
0/150
提交评论