php实现无限极分类

本文介绍了如何使用PHP通过递归方法实现无限级分类。通过构建数据和递归处理,可以将扁平化的分类数据转化为多级结构,例如电脑 > 笔记本 > 超级本 > 游戏本 > 台式机,手机 > 智能机 > 功能机。

利用两个for循环实现无限级分类

表:

字段名字段类型备注默认值
idint主键 auto-increment 
namevarchar分类名称 
pidint父类id0
顶级分类的 pid 默认就是0了。当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先将所有分类取出来,数据保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率

1. 构建数据
$categories = array(
    array('id'=>1,'name'=>'电脑','pid'=>0),
    array('id'=>2,'name'=>'手机','pid'=>0),
    array('id'=>3,'name'=>'笔记本','pid'=>1),
    array('id'=>4,'name'=>'台式机','pid'=>1),
    array('id'=>5,'name'=>'智能机','pid'=>2),
    array('id'=>6,'name'=>'功能机','pid'=>2),
    array('id'=>7,'name'=>'超级本','pid'=>3),
    array('id'=>8,'name'=>'游戏本','pid'=>3),
);

目标是将它转化为下面这种结构
电脑 >笔记本 >>超级本 >> 游戏本 > 台式机
手机 > 智能机 > 功能机

2. 处理过程
$tree = array();
//第一步,将所有的分类id作为数组key,并创建children单元
foreach($categories as $category){
    $tree[$category['id']] = $category;
    $tree[$category['id']]['children'] = array();
}
//第二步,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach ($tree as $key=>$value) {
    if ($value['pid'] != 0) {
        $tree[$value['pid']]['children'][] = &$tree[$key];
    }
}
print_r($tree);


原文 http://blog.youkuaiyun.com/u013927110/article/details/44086253

二。递归分类

class Category {
 

        static public functionsortOut($cate,$pid=0,$level=0,$html='--'){
 
                          $tree = array();
 
                          foreach($cate as $v){
 
                                          if($v['id'] == $pid){
 
                                                          $v['level'] = $level + 1;
 
                                                          $v['html'] = str_repeat($html, $level);
 
                                                          $tree[] = $v;
 
                                                    $tree = array_merge($tree,self::sortOut($cate,$v['id'],$level+1,$html));
 
                                          }
 
                      }
 
                          return $tree;
 
        }
}

function  tree(&$list,$pid=0,$level=0,$html='--'){
    static $tree= array();
   foreach($list as $v){
       if($v['pid'] == $pid){
           $v['sort'] = $level;
          $v['html'] = str_repeat($html,$level);
           $tree[] = $v;
           tree($list,$v['id'],$level+1);
       
    }
    return$tree;
}














评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值