1.1 pid实现__无限分类
使用递归算法,表中一个字段id,一个字段父id
子的pid = 父的id
根据 where id = pid 查出上一级内容,运用递归至顶层。
递归是什么?
递归是一种自己调用自己的编程技巧,也可以理解为一种特殊的循环。
//输出1-10
function deepLoop($i =1){
echo $i;
$i++;
if ($i<=10) {
deepLoop($i);
}
}
deepLoop();
1)正向查找( 查找自己的子类 )
场景:添加分类 (从上往下找)
<?php //1 连接数据库 $link = mysqli_connect('localhost','root','root','sfkbbs'); if (mysqli_connect_errno()) { exit(mysqli_connect_error()); } mysqli_set_charset($link,'utf8'); //2 核心递归函数 function getList($link,$pid=0,&$data=[],$num=0){ $num = $num+2;//输出空格的数量 $sql = "select * from bbs_category where pid = $pid";//通过pid查找子类数据 $result = mysqli_query($link,$sql); while ($row = mysqli_fetch_assoc($result)) { $row['name'] = str_repeat(' ',$num).'|------'.$row['name'];//给name字段值加上分隔符号 $data[] = $row;//保存循环的数据 //递归调用自己 【当前父类的id = 子类的pid】 所以把父类的id值传进去 getList($link,$row['id'],$data,$num); } return $data;//返回数据 } //3 方便调用的显示输出函数 function displayList($link,$pid=0,$selected=0){ $res = getList($link,$pid); $str = ''; $str .= "<select name='cate'>"; foreach ($res as $key=>$val){ $check = ''; if ($val['id']==$selected) { $check = 'selected'; } $str .= "<option {$check} value='{$val['id']}'>{$val['name']}</option>"; } return $str .= "</select>"; } //4 调用函数 echo displayList($link,0,4);
最后实现的效果
2)反向查找 ( 查找自己的父类 )
场景:面包屑导航 (从下往上查)
<?php //1 数据库连接 $link = mysqli_connect('localhost','root','root','sfkbbs'); if (mysqli_connect_errno()) { exit(mysqli_connect_error()); } mysqli_set_charset($link,'utf8'); /* * 2 核心递归函数 * $link 数据库连接 * $id 要查询的分类id * $data 返回的数据 引用传递 */ function getCatePath($link,$id=0,&$data=[]){ $sql = "select id,name,pid from bbs_category where id=$id";//先查出数据 $result = mysqli_query($link,$sql);//执行SQL 返回结果集 $row = mysqli_fetch_assoc($result);//取出结果集 if ($row) { $data[] = $row;//把数据保存到数组中 //递归调用自己 【当前子类的pid=父类的id】把子类pid传给函数 getCatePath($link,$row['pid'],$data); } krsort($data);//对数组按照键名逆向排序 return $data;//返回数据 } //3 方便调用的显示函数 function displayCatePath($link,$id,$url='category.php?id='){ $data = getCatePath($link,$id); $str = '';//定义变量接收变量的字符串 foreach ($data as $k=>$val) { $str .= "<a href='{$url}{$val['id']}'>{$val['name']} ></a>"; } return $str;//返回字符串 } //4 调用函数 echo displayCatePath($link,27,'abc.php?id=');//函数返回字符串 可以直接echo
递归函数返回的数据
最后实现的效果:
------------------------------------------------------------------------------------------------------------------------