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('&nbsp;',$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 




 

  递归函数返回的数据

  最后实现的效果:

  

 ------------------------------------------------------------------------------------------------------------------------ 

 

 

 

 

posted @ 2020-12-24 21:26  棉花糖88  阅读(171)  评论(0编辑  收藏  举报