什么是PHP无限分类?就像windows下新建一个文件夹,在新建的文件夹下又可以新建一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分出它子类,子类又可以分出它的子类,这样一直无限循环下去,假设有这样的一个三级分类,新闻→PHP新闻→PHP7出来了。如果我们要查找“PHP7出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设计一个父类id的字段就可以实现PHP无限分类的功能了。
无限级分类原理简介
无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。
所需PHP文件
conn.php 数据库配置文件
deep.php 递归无限极分类文件
deep2.php 导航link式文件
建立数据库表
分类表:命名为deepcate
数据库准备:
建表deepcate:
CREATE TABLE IF NOT EXISTS `deepcate` ( `id` int(4) NOT NULL, `pid` int(11) NOT NULL, `catename` varchar(30) NOT NULL, `cateorder` int(11) unsigned NOT NULL DEFAULT '0', `createtime` int(10) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='分类表';
导入***数据:
INSERT INTO `deepcate` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (1, 0, '新闻', 0, 0), (2, 0, '图***', 0, 0), (3, 1, '国内新闻', 0, 0), (4, 1, '国际新闻', 0, 0), (5, 3, '北京新闻', 0, 0), (6, 4, '美国新闻', 0, 0), (7, 2, '美女图***', 0, 0), (8, 2, '风景图***', 0, 0), (9, 7, '欧美明星', 0, 0), (10, 9, '英国***', 0, 0);
配置连接文件
新建文件conn.php
<?php $db_host='localhost'; $db_user='root'; $db_password = ''; $db_name = ''; $link=@mysqli_connect($db_host,$db_user,$db_password)or die(mysql_error()); mysqli_select_db($link,$db_name)or die(mysqli_error()); mysqli_query("$link,set names utf8")or die('编码设置错误'); ?>
实现原理图
下拉列表样式
<?php include ("conn.php"); //首先定义一个函数,pid作为父类ID,定义为0 function getList($pid=0,&$result=array(),$space=0){//递归在***作是需要返回数组,我们使用引用的方法,对代码进行更改 $space=$space+2; $sql="SELECT*FROM deepcate WHERE pid = $pid";//使用sql语句,查询pid选面的子类。 $res = mysql_query($sql);//把结果放入数组中,然后返回到result中。 while ($row = mysql_fetch_assoc($res)){ $row['catename']=str_repeat(' ',$space).'|--|'.$row['catename'];//对分类的样式进行美化 $result[]=$row; getList($row['id'],$result,$space);//递归是函数自身调用自身的技巧,我们在查询子类 的 时候需要调用到getList($row['id']); }//子类的ID要作为下一级的ID所以要在后面带入$row['id']) return $result; } $rs=getList(); function displayCate($pid=0,$selected=1){ $rs=getList($pid); $str=''; $str.="<select name='cate'>"; foreach ($rs as $key=>$val){ $selectedstr=''; if ($val['id'] == $selected){ $selectedstr="selected"; } $str.="<option{$selectedstr}>{$val['catename']}</option>"; } return $str.='</select>'; } echo displayCate(0,2); ?>
要点:
递归实现无限级分类是用利用递归方式,找出父节点,生成一个家谱树。
子类与父类。
导航LINK样式
<?php include('conn.php'); function getCatePath($cid, &$result = array()) { /*同下拉样式相同,创建getCatePath函数,执行sql语句查询id,并把取得的付给$rs. 使用mysql_fetch_assoc来获取数组,调用自身getCatePath把pid和自身的id进行查询。*/ $sql = "SELECT * FROM deepcate WHERE id=$cid"; $rs = mysql_query($sql); $row = mysql_fetch_assoc($rs); if ($row) { $result[] = $row; getCatePath($row['pid'], $result); } krsort($result); //返回$result,使用逆向的方式对数组进行排序。 return $result; } function displayCatePath($cid,$url='cate.php?cid=') { $res = getCatePath($cid); $str = ''; foreach ($res as $key => $val) { $str.= "<a href={$url}{$val['id']}>{$val['catename']}</a>>"; } return $str; } echo displayCatePath(10); ?>
要点:
1.link样式是从父节点开始,向下寻找其子孙节点,而形成的一个树状图形,link样式判断的是当前节点的pid与上一个节点的id相等.