PHP无限分类
什么是PHP无限分类?就像windows下新建一个文件夹,在新建的文件夹下又可以新建一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分出它子类,子类又可以分出它的子类,这样一直无限循环下去,假设有这样的一个三级分类,新闻→PHP新闻→PHP7出来了。如果我们要查找“PHP7出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设计一个父类id的字段就可以实现PHP无限分类的功能了。
无限级分类原理简介
无限分类看似”高大上”,实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。
所需PHP文件
conn.php 数据库配置文件
deep.php 递归无限极分类文件
deep2.php 导航link式文件
数据库准备:
建表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=@mysql_connect($db_host,$db_user,$db_password)or die(mysql_error());
mysql_select_db($db_name,$link)or die(mysql_error());
mysql_query("set names utf8;")or die('编码设置错误');
?>
$db_password = ”;填写数据库的连接密码, $db_name = ”;
填写数据库的名称。 后面在用到数据库文件时候只需要调用conn.php即可。
实现原理图

下拉列表式无限级分类
<?php
include ("conn.php");
function getList($pid=0,&$result=array(),$space=0){
$space=$space+2;
$sql="SELECT*FROM deepcate WHERE pid = $pid";
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)){
$row['catename']=str_repeat(' ',$space).'|--|'.$row['catename'];
$result[]=$row;
getList($row['id'],$result,$space);
}
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);
?>
实例就是一个无限级分类,下面我们就对代码进行分段的讲解。
代码解释:
<?php
include ("conn.php");
function getList($pid=0,&$result=array(),$space=0){
$space=$space+2;
$sql="SELECT*FROM deepcate WHERE pid = $pid";
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)){
$row['catename']=str_repeat(' ',$space).'|--|'.$row['catename'];
$result[]=$row;
getList($row['id'],$result,$space);
}
return $result;
}
$rs=getList();
?>
function getList($pid=0){
}
首先定义一个函数,pid作为父类ID,定义为0。
$sql="SELECT*FROM deepcate WHERE pid = $pid";
使用sql语句,查询pid选面的子类。
$res = mysql_query($sql);
//执行sql语句
$result=array();
while ($row = mysql_fetch_assoc($res)){
$result[]=$row;
}
return $result;
把结果放入数组中,然后返回到result中。
递归是函数自身调用自身的技巧,我们在查询子类 的 时候需要调用到getList($row[‘id’]);
子类的ID要作为下一级的ID所以要在后面带入$row[‘id’])
这时候的代码为
<?php
function getList($pid=0){
$sql="SELECT*FROM deepcate WHERE pid = $pid";
$res = mysql_query($sql);
$result=array();
while ($row = mysql_fetch_assoc($res)){ $result[]=$row; } return $result;
}
?>
递归在操作是需要返回数组,我们使用引用的方法,对代码进行更改
<?php
include ("conn.php");
function getList($pid=0,&$result=array()){
$sql="SELECT*FROM deepcate WHERE pid = $pid";
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)){
$result[]=$row;
getList($row['id'],$result);
}
return $result;
}
?>
接下来对分类的样式进行美化
<?php
include ("conn.php");
function getList($pid=0,&$result=array(),$space=0){
$space=$space+2;
$sql="SELECT*FROM deepcate WHERE pid = $pid";
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)){
$row['catename']=str_repeat(' ',$space).'|--|'.$row['catename'];
$result[]=$row;
getList($row['id'],$result,$space);
}
return $result;
}
$rs=getList();
print_r($rs);
?>
打印出来进行观察。
本章重点
- 递归实现无限级分类是用利用递归方式,找出父节点,生成一个家谱树。
- 子类与父类。
<?php
include ("conn.php");
function getList($pid=0,&$result=array(),$space=0){
$space=$space+2;
$sql="SELECT*FROM deepcate WHERE pid = $pid";
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)){
$row['catename']=str_repeat(' ',$space).'|--|'.$row['catename'];
$result[]=$row;
getList($row['id'],$result,$space);
}
return $result;
}
$rs=getList();
echo"<select name='cate'>";
foreach ($rs as $key=>$val){
echo "<option>{$val['catename']}</option>";
}
echo'</<select>'
?>

对获得的数据进行美化得到上图样式,这就是无限级分类。
为了以后调用方便,我们把递归函数进行封装。
<?php
include ("conn.php");
function getList($pid=0,&$result=array(),$space=0){
$space=$space+2;
$sql="SELECT*FROM deepcate WHERE pid = $pid";
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)){
$row['catename']=str_repeat(' ',$space).'|--|'.$row['catename'];
$result[]=$row;
getList($row['id'],$result,$space);
}
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);
?>
这样我们的无限级分类列表样式就完成了。
PHP无限级分类之导航LINK样式
实现原理图

导航LINK样式:
<?php
include('conn.php');
function getCatePath($cid, &$result = array()) {
$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); //krsort对数组按键名逆向
return $result;
}
?>
代码解释:
同下拉样式相同,创建getCatePath函数,执行sql语句查询id,并把取得的付给$rs.使用mysql_fetch_assoc来获取数组,调用自身getCatePath把pid和自身的id进行查询。
返回$result,使用逆向的方式对数组进行排序。
然后继续进行美化,封装起来。
<?php
include('conn.php');
function getCatePath($cid, &$result = array()) {
$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); //krsort对数组按键名逆向
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);
这样,无限级分类的LINK样式就完成了。
本章难点
1.link样式是从父节点开始,向下寻找其子孙节点,而形成的一个树状图形,link样式判断的是当前节点的pid与上一个节点的id相等、
点个赞
哈哈哈哈哈
6666
老哥 我想..
装装逼
顶
哈哈
老哥 我想..
百度来的,网站挺好看的
哈哈哈哈哈
啦啦啦啦
顶
啦啦啦啦
支持一下
过来逛逛
网站挺不错的!
稳
可以的
支持一下
过来逛逛
测试一下
可以的
啦啦啦啦
老哥 我想..
老哥 我想..
哈哈哈哈哈
就服你
支持一下
网站挺不错的!
测试一下
老哥 我想..
超喜欢这里的
顶
超喜欢这里的
过来逛逛
点赞是不可能点赞的
点个赞
可以的
6666
哈哈哈哈哈
装装逼
超喜欢这里的
支持一下
稳
主题不错!
百度来的,网站挺好看的
6666
过来逛逛
可以的
顶
网站挺不错的!
6666
点赞是不可能点赞的
老哥 我想..
啦啦啦啦
老哥 我想..
支持一下
支持一下
百度来的,网站挺好看的
装装逼
顶
网站挺不错的!
支持一下
老哥 我想..
可以的
就服你
啦啦啦啦
牛逼
过来逛逛
点个赞
牛逼
点赞是不可能点赞的
网站挺不错的!
就服你
牛逼
牛逼
主题不错!
超喜欢这里的
顶
点个赞
可以的
可以的
我只是随便看看
我只是随便看看
哈哈哈哈哈
顶
装装逼
牛逼
点个赞
稳
点个赞
百度来的,网站挺好看的
6666
稳
超喜欢这里的
点赞是不可能点赞的
主题不错!
6666
我只是随便看看
稳
稳
就服你
哈哈哈哈哈
过来逛逛
老哥 我想..
可以的
6666
点个赞
网站挺不错的!
就服你
哈哈
过来逛逛
主题不错!
主题不错!
百度来的,网站挺好看的
测试一下
哈哈
稳
支持一下
啦啦啦啦
6666
啦啦啦啦
网站挺不错的!
超喜欢这里的
点个赞
稳
哈哈哈哈哈
百度来的,网站挺好看的
啦啦啦啦
网站挺不错的!
哈哈哈哈哈
我只是随便看看
点赞是不可能点赞的
测试一下
测试一下
就服你
老哥 我想..
啦啦啦啦
6666
超喜欢这里的
点个赞
哈哈哈哈哈
老哥 我想..
支持一下
测试一下
百度来的,网站挺好看的
哈哈
哈哈哈哈哈
测试一下
百度来的,网站挺好看的
点个赞
哈哈
点个赞
可以的
牛逼
老哥 我想..
点个赞
网站挺不错的!
百度来的,网站挺好看的
支持一下
啦啦啦啦
牛逼
我只是随便看看
支持一下
老哥 我想..
支持一下
装装逼
测试一下
装装逼
牛逼
老哥 我想..
百度来的,网站挺好看的
哈哈哈哈哈
支持一下
超喜欢这里的
顶
老哥 我想..
老哥 我想..
可以的
主题不错!
就服你
稳
百度来的,网站挺好看的
老哥 我想..
超喜欢这里的
过来逛逛
哈哈哈哈哈
测试一下
网站挺不错的!
点个赞
就服你
装装逼
哈哈哈哈哈
百度来的,网站挺好看的
牛逼
老哥 我想..
老哥 我想..
哈哈哈哈哈
装装逼
稳
点赞是不可能点赞的
我只是随便看看
点个赞
百度来的,网站挺好看的
主题不错!
顶
点赞是不可能点赞的
稳
稳
点赞是不可能点赞的
我只是随便看看
超喜欢这里的
哈哈哈哈哈
哈哈哈哈哈
主题不错!
超喜欢这里的
测试一下
稳
测试一下
测试一下
可以的
超喜欢这里的
就服你
主题不错!
点个赞
过来逛逛
网站挺不错的!
我只是随便看看
主题不错!
装装逼
哈哈哈哈哈
百度来的,网站挺好看的
点个赞
超喜欢这里的
顶
主题不错!
稳
网站挺不错的!
6666
网站挺不错的!
我只是随便看看
顶
老哥 我想..
百度来的,网站挺好看的
百度来的,网站挺好看的
超喜欢这里的
啦啦啦啦
老哥 我想..
超喜欢这里的
稳
超喜欢这里的
网站挺不错的!
我只是随便看看
支持一下
支持一下
啦啦啦啦
主题不错!
顶
牛逼
百度来的,网站挺好看的
啦啦啦啦
老哥 我想..
哈哈
6666
点个赞
测试一下
超喜欢这里的
装装逼
点赞是不可能点赞的
哈哈哈哈哈
稳
6666
网站挺不错的!
百度来的,网站挺好看的
可以的
装装逼
哈哈哈哈哈
点个赞
牛逼
就服你
装装逼
我只是随便看看
点赞是不可能点赞的
支持一下
顶
顶
百度来的,网站挺好看的
啦啦啦啦
支持一下
超喜欢这里的
支持一下
主题不错!
啦啦啦啦
超喜欢这里的
网站挺不错的!
哈哈
可以的
点个赞
老哥 我想..
顶
装装逼
6666
稳
点个赞
超喜欢这里的
哈哈哈哈哈
主题不错!
老哥 我想..
可以的
老哥 我想..
哈哈哈哈哈
稳
测试一下
过来逛逛
牛逼
老哥 我想..
哈哈哈哈哈
百度来的,网站挺好看的
牛逼
啦啦啦啦
哈哈哈哈哈
哈哈哈哈哈
百度来的,网站挺好看的
网站挺不错的!
我只是随便看看
主题不错!
主题不错!
6666
6666
哈哈哈哈哈
哈哈哈哈哈
测试一下
啦啦啦啦
稳
支持一下
网站挺不错的!
就服你
百度来的,网站挺好看的
网站挺不错的!
过来逛逛
哈哈
点个赞
过来逛逛
顶
网站挺不错的!
顶
牛逼
网站挺不错的!
点赞是不可能点赞的
超喜欢这里的
网站挺不错的!
点个赞
点个赞
老哥 我想..
顶
超喜欢这里的
过来逛逛
哈哈
测试一下
点赞是不可能点赞的
我只是随便看看
6666
老哥 我想..
哈哈哈哈哈
哈哈哈哈哈
老哥 我想..
百度来的,网站挺好看的
测试一下
就服你
可以的
稳
主题不错!
网站挺不错的!
6666
支持一下
就服你
哈哈
哈哈
测试一下
超喜欢这里的
稳
可以的
6666
测试一下
哈哈
测试一下
6666
主题不错!
装装逼
点赞是不可能点赞的
百度来的,网站挺好看的
网站挺不错的!
牛逼
装装逼
啦啦啦啦
过来逛逛
6666
点赞是不可能点赞的
测试一下
点个赞
稳
过来逛逛
啦啦啦啦
我只是随便看看
哈哈哈哈哈
稳
点赞是不可能点赞的
支持一下
测试一下
超喜欢这里的
稳
稳
6666
支持一下
支持一下
超喜欢这里的
我只是随便看看
支持一下
可以的
网站挺不错的!
超喜欢这里的
哈哈哈哈哈
稳
哈哈哈哈哈
装装逼
哈哈哈哈哈
可以的
牛逼
装装逼
哈哈
主题不错!
可以的
可以的
点个赞
超喜欢这里的
超喜欢这里的
主题不错!
测试一下
哈哈
哈哈
牛逼
顶
哈哈
过来逛逛
稳
稳
顶
测试一下
6666
就服你
百度来的,网站挺好看的
6666
网站挺不错的!
可以的
啦啦啦啦
点赞是不可能点赞的
支持一下
主题不错!
过来逛逛
点赞是不可能点赞的
6666
主题不错!
顶
老哥 我想..
主题不错!
百度来的,网站挺好看的
超喜欢这里的
顶
可以的
稳
超喜欢这里的
稳
点赞是不可能点赞的
百度来的,网站挺好看的
网站挺不错的!
默默收藏了,悄咪咪评个论
网站挺不错的!
网站挺不错的!
………..
还可以吧
学到了,原来还可以这样啊
这篇文章写得真不错,收藏一下~
还没看完,但是先评论点赞了哈哈哈
牛掰牛掰,点个赞
这篇文章写得真不错,收藏一下~
这篇文章写得真不错,收藏一下~
这篇文章写得真不错,收藏一下~
哈哈哈哈哈哈哈哈
学到了,原来还可以这样啊
………..
这篇文章写得真不错,收藏一下~
哈哈哈哈哈哈哈哈
哈哈哈哈哈哈哈哈
默默收藏了,悄咪咪评个论
点赞o( ̄▽ ̄)d
牛掰牛掰,点个赞
………..
有点东西哇
有点东西哇
默默收藏了,悄咪咪评个论
默默收藏了,悄咪咪评个论
有点东西哇
牛掰牛掰,点个赞
有点东西哇
学到了,原来还可以这样啊
这篇文章写得真不错,收藏一下~
还没看完,但是先评论点赞了哈哈哈
点赞o( ̄▽ ̄)d
还可以吧
默默收藏了,悄咪咪评个论
还没看完,但是先评论点赞了哈哈哈
哈哈哈哈哈哈哈哈
牛掰牛掰,点个赞
………..
默默收藏了,悄咪咪评个论
有点东西哇
点赞o( ̄▽ ̄)d
默默收藏了,悄咪咪评个论
这篇文章写得真不错,收藏一下~
点赞o( ̄▽ ̄)d
哈哈哈哈哈哈哈哈
还可以吧
还可以吧
有点东西哇