Home  >  Article  >  Backend Development  >  A PHP class tree (supports unlimited classification)_PHP tutorial

A PHP class tree (supports unlimited classification)_PHP tutorial

WBOY
WBOYOriginal
2016-07-21 16:09:04741browse


Recently, there have been a lot of questions asked about infinite classification trees, so I was happy to write one myself. I just finished it. You can use it to see how to implement it faster and simpler. Post your tree as well (required) Only query the database once)


This is a class tree with a classification list, supporting unlimited classifications

A classification can have both "classification containing subclasses" and "Final classification";


The only advantage is that ***** only needs to perform a database ***** query once.


It doesn’t look very good It looks good, but it can be customized and modified. You can define your own css and add it


Caching has not been done yet, you can make it up yourself

The directory structure of the example below is like this. 
¦--Catagory.php                                       
 
¦--images----tree.jsp                           
 
¦--images----treeopen.gif                   
 
¦--images----treeclose.gif                 
 
¦--images----line.gif                           
 

/****************tree.jsp********************/ 
function  expand(id){ 
           node  =  document.all('node'+id); 
           if(node.style.display==''){ 
                       node.style.display  =  'none'; 
                       document.images('img'+id).src  =  imgopen; 
           }else{ 
                       node.style.display  =  ''; 
                       document.images('img'+id).src  =  imgclose; 
           } 
}

/****************Catagory.php********************/

define('CATAGORY_TREE_EXPEND_NONE',0);
define('CATAGORY_TREE_EXPEND_ALL',1);

class Catagory{
//Basic classification data
var $treeData = array();
//Classified hierarchical structure array, with the id value of the category as the key of the array
var $treePList = array();
//Relationship between self-categorization and parent class
var $treeCList = array();
/*
/* This is a template for large classification
*
* __id__ The number of the category
The name of the category
The name of the category $imgOpen or $imgClose
* __open__ Whether the category is currently expanded
* __inner__ Sub-category Shown location * The style can be modified according to your own needs, but existing elements cannot be deleted
*/
var $blockTpl = '






                                                                                                                                                                                               ';
/*
        * This is a template for small categories                                                                                          5 " height="15">__name__
';
                                                                                           ?id=__id__"> ;__name__';
var $js = "images/tree.js";

var $imgOpen = 'images /treeopen.gif';
var $imgClose = 'images/treeclose.gif';
var $imgLine = 'images/line.gif';

var $cachFile = '';
var $expand = 0;

var $result = array();
       var  $treeStr  =  ''; 
       var  $currentStr  =  ''; 
       /* 
         *  用来初始化,传入分类数据 
         * 
         *param  $data  array() 
       */ 
           function  Catagory(&$data){ 
               $this->_init($data); 
       } 

       function  _init($tmpData){ 
               $plevel  =  $clevel  =  $treeData  =  array();  foreach($tmpData  as  $value){ 
                           $treeData[$value['id']]  =  $value; 
                           $plevel[$value['pid']][$value['id']]  =  'END'; 
                       $clevel[$value['id']]  =  $value['pid']; 
                   } 
               $this->treeData  =  &$treeData; 
               $this->treePList  =  &$plevel; 
               $this->treeCList  =  &$clevel; 
           } 
       /* 
         *  解析分类列表 
         * 
         *param  $cataId  int  要解析的主分类的编号 
       */ 
       function  parseNode($cataId=0){ 
               $this->result  =  $this->treePList[$cataId]; 
               if($this->result==null)  die("Catagory  id  error"); 
                   $this->treeStr  =    $this->_doNode($this->result); 
               $this->treeStr  .=  $this->_jsParse(); 
       } 

           function  &_doNode(&$result){ 
                   $nstr  =  $estr  =  ''; 
                   foreach($result  as  $key=>$value){ 
                           if(isset($this->treePList[$key])){ 
                                   $result[$key]  =  $this->treePList[$key]; 
                                   $inner  =  $this->_doNode($result[$key]); 
                               $nstr  .=  $this->_parseNodeTpl($key,  $inner); 
                           }else{ 
                               $estr  .=  $this->_parseElementTpl($key); 
                       } 
               } 
               return  $nstr.$estr; 
           } 

       function  &_parseNodeTpl($cataId,  $inner){ 
               $data  =  $this->treeData[$cataId]; 
               $str  =  preg_replace('  ¦__id__  ¦',  $data['id'],  $this->blockTpl); 
               $str  =  preg_replace('  ¦__name__  ¦',  $data['name'],  $str); 
               $str  =  preg_replace('  ¦__image__  ¦',  ($this->expand?  $this->imgClose:$this->imgOpen),  $str); 
               $str  =  preg_replace('  ¦__open__  ¦',  ($this->expand?'':'none'),  $str); 
               $str  =  preg_replace('  ¦__inner__  ¦',  $inner,  $str); 
               return  $str; 
       } 

       function  _parseElementTpl($cataId){ 
               $data  =  $this->treeData[$cataId]; 
               $str  =  preg_replace('  ¦__id__  ¦',  $data['id'],  $this->elementTpl); 
               $str  =  preg_replace('  ¦__name__  ¦',  $data['name'],  $str); 
               $str  =  preg_replace('  ¦__image__  ¦',  $this->imgLine,  $str); 
               return  $str; 
       }​ function _jsParse(){
                                                                                                                                                                                                                                                                                                                                                   
& lt;/script & gt; & lt; script src = "$ this- & gt; js" language = "javascript" & gt; & lt;/script & gt; "
Return $ str; 🎜>}
/ *
     * Expand category $cataId                                                  $str = '' ;
                                                                    . ) ;
}
$this->currentStr = &$str;

function _parseCurrentTpl($cataId){
$data = $this->treeData [$cataId];
$ Str = Preg_replace ('¦__ID__ ¦', $ Data ['ID'], $ this-& gt; Currenttpl); '], $str);
return $str;
}
                                                                                                               ){
                                                                                                                                                                               = "expand($ cataid); "
WHILE (isset ($ this-& gt; treeClist [$ cataid]) && $ this- & gt; timeclist [$ cataid]! = 0) {
$ str. .$this->treeCList[$cataId].");";
                                              ->treeStr .= " ";
                                                                          return $this->currentStr;                                    return $this->treeStr;
                                                                                  $this->elementTpl = $ elementTpl;
$this->currentTpl = $currentTpl;
$this->js = $js;
}

function setImage($open , $close, $line) {
$this->imgOpen = $open;
$this->imgClose = $close;
$this->imgLine = $line;
}  

function setExpend($expand){
                                                                                

//分类的基础数据的样子如下: 
$data  =  array(array('id'=>1,  'name'=>'name1',  'pid'=>0,  'order'=>1), 
                           array('id'=>2,  'name'=>'name2',  'pid'=>1,  'order'=>1), 
                           array('id'=>3,  'name'=>'name3',  'pid'=>0,  'order'=>1), 
                           array('id'=>4,  'name'=>'name4',  'pid'=>3,  'order'=>1), 
                           array('id'=>5,  'name'=>'name5',  'pid'=>6,  'order'=>1), 
                           array('id'=>6,  'name'=>'name6',  'pid'=>2,  'order'=>1), 
                           array('id'=>7,  'name'=>'name7',  'pid'=>6,  'order'=>1), 
                           array('id'=>8,  'name'=>'name8',  'pid'=>3,  'order'=>1), 
                           array('id'=>9,  'name'=>'name9',  'pid'=>6,  'order'=>1), 
                           array('id'=>10,  'name'=>'name10',  'pid'=>0,  'order'=>1),
                           array('id'=>11, 'name'=>'name11', 'pid'=>10, 'order'=>1),
                          array('id'=>12, 'name'=>'name12', 'pid'=>10, 'order'=>1),
                          array('id'=>13, 'name'=>'name13', 'pid'=>10, 'order'=>1),
                          array('id'=>14, 'name'=>'name14', 'pid'=>12, 'order'=>1),
                          array('id'=>15, 'name'=>'name15', 'pid'=>12, 'order'=>4),
                  ); echo "";
$tree = new Catagory($data);
echo "
下面是当前分类的类树
";
//$tree->setExpend(1);
$tree->parseNode(0);
//$tree->parseNode(1);
//$tree->expand(9);
echo $tree->getTreeStr();

echo "
下面是当前分类(分类的编号是9)的路径
";
$tree->parseCurrent(9);
echo $tree->getCurrentStr();

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/314589.htmlTechArticleRecently, there have been a lot of questions about infinite classification of class trees, so I was happy and wrote one myself. I just finished it. , let’s try it and see how it can be implemented faster and simpler. Post your tree too...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

< img src="__image__" border="0" width="15" height="15" id="img__id__">


__name__