无限分类

概述:
无线分类就是一个分类下面可以创建多个子类,而其子类下面亦可以创建不同子类,如此往复没有终点。
 

常用的几种实现
1.以父ID实现的无线分类
使用递归算法。表中一个字段id,一个字段pid(父id)。
这样可以根据WHERE id=pid来查出上一级内容,运用递归至顶层。
2.以全路径实现的无线分类
表中有一字段path:1,2,3.使用where path like ‘1,2,3,%’order by cpath asc查出它及其子类的列表。
 

什么是递归?程序调用自身的编程技巧成为递归。
function getList($pid){
    ...
    if($row){                                   1.$_GLOBAL[$result]
    getList($pid);                            2.static $result
    }                                                 3.参数引用&
    ...
    return $result;
}
 
eg:
1.function deeploop(&$i=1){
    echo $i;
    $i++;
    if($i<10){
        deeploop($i);
    }
}
deeploop();
 
2.$i=1;
function deeploop(){
    global $i;
    echo $i;
    $i++;
    if($i<10){
        deeploop($i);
    }
}
 
3.function deeploop(){
    static $i=1;
    echo $i;
    $i++;
    if($i<10){
        deeploop($i);
    }
}
 
循环:
for($i=1;$<10;$i++){
    echo $i.'<br />';
}

递归无线分类原理:
每一个分类都需要记录它的父级id,当为顶级分类时,父级id为0。这样无论哪个分类,都可以通过父级id一层层的去查明它所有的父级,以便清楚知道它所属何种分类,层级深度为几。

例子代码:
1.连接数据库:db.inc.php
<?php
$db_host = 'localhost';
$db_user = 'root';
$db_password = 12345678;
$db_name = 'deepcate';
$link = mysql_connect($db_host, $db_user, $db_password) or die(mysql_error());
mysql_select_db($db_name) or die(mysql_error());
mysql_query('set names utf8');
2.获取信息
<?php 
include('db.inc.php');
function getList($pid=0,&$result=array(),$spac=0){
    $spac = $spac + 2;
    $sql = "select * from deeploop where pid = $pid";
    $res = mysql_query($sql);
    while($row = mysql_fetch_assoc($res)){
        $row['catename'] = str_repeat('&nbsp;', $spac).'|--'.$row['catename'];
        $result[] = $row;
        getList($row['id'], $result, $spac);
    }
    return $result;
}
 
$rs = getList();
echo "<pre>";
print_r($rs);
foreach($rs as $key=>$val){
    echo $val['catename']."<br/>";
}

3.封装成函数
php无限分类下拉列表的代码实现
<?php 
include('db.inc.php');
function getList($pid=0,&$result=array(),$spac=0){
    $spac = $spac + 2;
    $sql = "select * from deeploop where pid = $pid";
    $res = mysql_query($sql);
    while($row = mysql_fetch_assoc($res)){
        $row['catename'] = str_repeat('&nbsp;&nbsp;',$spac).'|--'.$row['catename'];
        $result[] = $row;
        getList($row['id'], $result, $spac);
    }
    return $result;
}
 
function displayCate($pid=0, $selected=0){
    $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(7,2);

无限分类分类导航LINK的代码实现
<?php 
include('db.inc.php');
function getCatePath($cid, &$result=array()){
    $sql = "select * from deeploop where id = $cid";
    $rs = mysql_query($sql);
    $row = mysql_fetch_assoc($rs);
    if($row){
        $result[] = $row;
        getCatePath($row['pid'], $result);
    }
    krsort($result);
    return $result;
}
// $rs = getCatePath(10);
// print_r($rs);
// echo "<br/>";
// foreach($rs as $key=>$val){
//     echo "<a href='cate.php?cid={$val['id']}'>{$val['catename']} </a> >";
// }
 
function displayCatePath($cid,$url="cate.php?cid="){
    $res = getCatePath($cid);
    $str = '';
    foreach($res as $k=>$val){
        $str .= "<a href='cate.php?cid={$val['id']}'>{$val['catename']} </a> >";
    }
    return $str;
}
 
echo displayCatePath(10,'cate.php?page=1&id=');

移动分类(不能移到自己及其子类下面)
删除分类(只能删除最底层的分类,即不含子分类的分类)

全路径无限分类的原理
1.原理:
以一个字段把它所有父级id按顺序记录下来以此来实现的无限分类叫做全路径无限分类。
优点:
查询方便
 
缺点:
增加、移动分类时数据维护稍显复杂
 
利用全路径字段(形如1,2,3,4,这样)加上ID组成新字段正序排列,然后再利用字段长度(以.分割)来计算出层级深度。
例如:
select id,catename,path,CONCAT(path,',',id) AS fullpath from likecate WHERE 1 order by fullpath asc;

全路径无限分类下拉列表的实现:
<?php 
include('db.inc.php');
 
function likecate($path=''){
    $sql = "select id,catename,path,concat(path,',',id) as fullpath from likecate order by fullpath asc";
    $res = mysql_query($sql);
    $result = array();
    while($row = mysql_fetch_assoc($res)){
        $deep = count(explode(',', trim($row['fullpath'],',')));
        $row['catename'] = str_repeat('&nbsp;&nbsp;', $deep*2).'|--'.$row['catename'];
        $result[] = $row;
    }
    return $result;
}
 
$res = likecate();
print_r($res);
echo "<br/>";
echo "<select name='cate'>";
foreach($res as $key=>$val){
    echo "<option>{$val['catename']}</option>";
}
echo "</select>";
 
 

全路径无限分类导航LINK代码的实现:
<?php 
include('db.inc.php');
 
function likecate($path=''){
    $sql = "select id,catename,path,concat(path,',',id) as fullpath from likecate order by fullpath asc";
    $res = mysql_query($sql);
    $result = array();
    while($row = mysql_fetch_assoc($res)){
        $deep = count(explode(',', trim($row['fullpath'],',')));
        $row['catename'] = str_repeat('&nbsp;&nbsp;', $deep*2).'|--'.$row['catename'];
        $result[] = $row;
    }
    return $result;
}
 
// $res = likecate();
// print_r($res);
// echo "<br/>";
// echo "<select name='cate'>";
// foreach($res as $key=>$val){
//     echo "<option>{$val['catename']}</option>";
// }
// echo "</select>";
function displayCateList(){
    $res = likecate();
    $str = "<select name='cate'>";
    foreach($res as $key=>$val){
        $str .= "<option>{$val['catename']}</option>";
    }
    return $str .= '</select>';
}
 
echo displayCateList();
 
function getPathCate($cateid){
    $sql = "select *,concat(path,',',id) as fullpath from likecate where id = $cateid";
    $res = mysql_query($sql);
    $row = mysql_fetch_assoc($res);
    $ids = $row['fullpath'];
    $sql = "select * from likecate where id in ($ids) order by id asc";
    $res = mysql_query($sql);
    $result = array();
    while($row = mysql_fetch_assoc($res)){
        $result[] = $row;
    }
    return $result;
}
 
$rs = getPathCate(4);
// print_r($rs);
function displayCatePath($cateid, $link='cate.php?cid='){
    $res = getPathCate($cateid);
    $str = '';
    foreach($res as $k=>$v){
        $str .= "<a href='{$link}{$v['id']}'>{$v['catename']}</a> >";
    }
    return $str;
}
 
echo displayCatePath(4,'cate.php?p=1&cid=');
 
 

转载于:https://www.cnblogs.com/bruisebd/p/5386175.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值