提高php无限分类查询的效率(使用数组和递归)

发布时间:2019-08-03编辑:脚本学堂
数据库:fruit 三个字段:id , parentid ,name 如何查询完所有分类(包括父分类和子分类)? 普遍的方法: 先查询最顶级的分类,select * from fruit where parentid=0.

数据库:fruit
三个字段:id , parentid ,name
如何查询完所有分类(包括父分类和子分类)?
普遍的方法:
先查询最顶级的分类,select * from fruit where parentid=0.
得到顶级分类的id,然后用递归的方法,根据父id查询子分类。
如此一来便会查询很多次数据库,而且分类越多,查询的次数增长得越快。

设想要是有10个人同时查询所有分类,而这个分类有4层,每层有10个子分类,估计你的数据库要哭了。

要文为大家介绍一个很实用的方法:把本来数据库做的工作交给了程序处理,一次性查询完所有分类。
类:Tree
 

复制代码 代码如下:
<?php
class Tree {
  
 /**
  * 从数据库查询出的所有分类信息
  * @var array
  * by:www.jb200.com
  */
 var $arr;
/**
 * 如下格式
 *  var $arr = array(
 1 => array(‘id’=>’1′,’parentid’=>0,’name’=>’一级栏目一’),
 2 => array(‘id’=>’2′,’parentid’=>0,’name’=>’一级栏目二’),
 3 => array(‘id’=>’3′,’parentid’=>1,’name’=>’二级栏目一’),
 );*/
  
 /**
  * 输出结构
  * @var array
  */
 var $tree = array();
 /**
  * 树形递归的深度
  * @var int
  */
 var $deep = 1;
  
 /**
  * 生成树形的修饰符号
  * @var array
  */
 var $icon = array(‘│’,'├’,'└’);
 /**
  * 生成指定id的下级树形结构
  * @param int $rootid 要获取树形结构的id
  * @param string $add 递归中使用的前缀
  * @param bool $parent_end 标识上级分类是否是最后一个
  */
 function getTree($rootid = 0,$add = ”,$parent_end =true){
  $is_top = 1;
  $child_arr = $this->getChild($rootid);
  if(is_array($child_arr)){
   $cnt = count($child_arr);
   foreach($child_arr as $key => $child){
    $cid = $child['id'];
    $child_child = $this->getChild($cid);
    if($this->deep >1){
     if($is_top == 1 && $this->deep > 1){
      $space = $this->icon[1];
      if(!$parent_end)
      $add .=  $this->icon[0];
      else $add .= ‘&nbsp;&nbsp;’;
     }
  
     if($is_top == $cnt){
      $space = $this->icon[2];
      $parent_end = true;
     }else {
      $space = $this->icon[1];
      $parent_end = false;
     }
    }
    $this->tree[] = array(‘spacer’=>$add.$k.$space,
           ‘name’=>$child['name'],
           ‘id’=>$cid
    );
    $is_top++;
  
    $this->deep++;
    if($this->getChild($cid))
    $this->getTree($cid,$add,$parent_end);
    $this->deep–;
  
   }
  
  }
  return $this->tree;
 }
  
 /**
  * 获取下级分类数组
  * @param int $root
  */
 function getChild($root = 0){
  
  $a = $child = array();
  foreach($this->arr as $id=>$a){
   if($a['parentid'] == $root){
    $child[$a['id']] = $a;
   }
  }
  return $child?$child:false;
     
 }
 /**
  * 设置源数组
  * @param $arr
  */
 function setArr($arr = array()){
  $this->arr = $arr;
 }
}

通过一次查询把结构保存进一个数组,再数组进行递归运算,无疑极大的提高了程序运行效率。
代码的使用很简单:得到查询结构后setArr,直接调用getTree, 皆可以得到按照程序排序号并带有前缀修饰等信息的数组。通过foreach这个数组可以得到如下的树状列表:
水果
├香蕉
├苹果
│├红富士
│└海南苹果
└桃子
记住:网站开发过程中,多数的瓶颈在数据库,而非php代码。
 

您可能感兴趣的文章:

php无限分类的例子(仿淘宝商品分类)
php实现的无限分类(递归版本)的例子
使用php数组实现的无限分类(不使用数据库与用递归)
php写的一个递归实现无限分类生成下拉列表的函数