博客列表 >PHP无限分类

PHP无限分类

福哥的博客
福哥的博客原创
2017年07月25日 10:25:151182浏览

什么是PHP无限分类?就像windows下新建一个文件夹,在新建的文件夹下又可以新建一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分出它子类,子类又可以分出它的子类,这样一直无限循环下去,假设有这样的一个三级分类,新闻→PHP新闻→PHP7出来了。如果我们要查找“PHP7出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设计一个父类id的字段就可以实现PHP无限分类的功能了。

无限级分类原理简介

无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。

所需PHP文件

conn.php    数据库配置文件

deep.php    递归无限极分类文件

deep2.php   导航link式文件

建立数据库表


分类表:命名为deepcate

1480556176269506.png

数据库准备: 

建表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('编码设置错误');
?>

实现原理图

123.png

下拉列表样式


<?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);
?>

要点:

  1. 递归实现无限级分类是用利用递归方式,找出父节点,生成一个家谱树。

  2. 子类与父类。

1477708200951766.png

导航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相等.

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议