php无极限分类各种方法总结

一、数据库设计

 1 CREATE TABLE `test` 
 2 (
 3     `id` int(11) NOT NULL AUTO_INCREMENT, 
 4     `name` varchar(48) DEFAULT NULL, 
 5     `pid` int(11) DEFAULT '-1', 
 6     PRIMARY KEY (`id`)
 7 ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
 8 
 9 INSERT INTO `test`
10     (`id`, `name`, `pid`) 
11 VALUES 
12     (1, '蔬菜', -1), 
13     (2, '水果', -1), 
14     (3, '肉类', -1), 
15     (4, '猪肉', 3), 
16     (5, '鸡肉', 3), 
17     (6, '鸡翅', 5), 
18     (7, '鸡腿', 5), 
19     (8, '浆果类', 2),
20     (9, '草莓', 8),
21     (10, '蓝莓', 8),
22     (11, '黑莓', 8),
23     (12, '西兰花', 1),
24     (13, '大白菜', 1), 
25     (14, '韭菜', 1);
26  

二、方法集合

  1 /**
  2   * 版本1.0
  3   * 将标准二维数组换成树
  4   * @param  array  $list   待转换的数据集
  5   * @param  string  $pk 唯一标识字段
  6   * @param  string  $pid    父级标识字段
  7   * @param  string  $child  子集标识字段
  8   * return  array 
  9   */
 10   function getTree1($list, $pk='id', $pid='pid', $child='child', $root=-1)
 11   {
 12         $tree = array();
 13         $packData = array();
 14 
 15         //将数组转换为索引数组
 16         foreach($list as $item)
 17         {
 18             $packData[$item[$pk]]=$item;
 19         }
 20         foreach($packData as $key => $value)
 21         {
 22             if($value[$pid] == $root)
 23             {
 24                 //根节点放入
 25                 $tree[]=&$packData[$key];
 26             }
 27             else
 28             {
 29                 //子节点放入
 30                 $packData[$value[$pid]][$child][]=&$packData[$key];
 31             }
 32         }
 33        return $tree;
 34   }
 35 
 36   /**
 37   * 版本2.0
 38   * 将标准二维数组换成树与v1.0类似
 39   * @param  array  $list   待转换的数据集
 40   * @param  string  $pk 唯一标识字段
 41   * @param  string  $pid    父级标识字段
 42   * @param  string  $child  子集标识字段
 43   * return  array 
 44   */
 45    function getTree2($list, $pk='id', $pid='pid', $child='child', $root=-1)
 46    {
 47         // 创建Tree
 48         $tree = array();
 49         if(is_array($list)) 
 50         {
 51             // 创建基于主键的数组引用
 52             $refer = array();
 53             foreach ($list as $key => $data) 
 54             {
 55                 $refer[$data[$pk]] =& $list[$key];
 56             }
 57 
 58             foreach ($list as $key => $data) 
 59             {
 60                 // 判断是否存在parent
 61                 $parentId =  $data[$pid];
 62                 if ($root == $parentId)
 63                 {
 64                     $tree[] =& $list[$key];
 65                 }
 66                 else
 67                 {
 68                     if (isset($refer[$parentId])) 
 69                     {
 70                         $parent =& $refer[$parentId];
 71                         $parent[$child][] =& $list[$key];
 72                     }
 73                 }
 74             }
 75         }
 76         return $tree;
 77    }
 78 
 79    /**
 80   * 版本3.0
 81   * 将标准二维数组换成树,利用递归方式实现
 82   * @param  array  $list   待转换的数据集
 83   * @param  string  $pk 唯一标识字段
 84   * @param  string  $pid    父级标识字段
 85   * @param  string  $child  子集标识字段
 86   * return  array 
 87   */
 88    function getTree3($list, $pk='id', $pid='pid', $child='child', $root=-1)
 89    {
 90        $tree=array();
 91         foreach($list as $key=> $val){
 92 
 93             if($val[$pid]==$root){
 94                 //获取当前$pid所有子类 
 95                     unset($list[$key]);
 96                     if(! empty($list)){
 97                         $child=getTree3($list,$pk,$pid,$child,$val[$pk]);
 98                         if(!empty($child)){
 99                             $val['_child']=$child;
100                         }                   
101                     }              
102                     $tree[]=$val; 
103             }
104         }   
105         return $tree;
106    }
107 
108 
109    /**
110   * 版本4.0
111   * 将标准二维数组换成数组,利用递归方式实现
112   * @param  array  $list   待转换的数据集
113   * @param  string  $pk 唯一标识字段
114   * @param  string  $pid    父级标识字段
115   * @param  string  $child  子集标识字段
116   * return  array 
117   */
118   function getTree4($list, $pid=-1, $level=1)
119   {
120         static $newlist = array();
121        foreach($list as $key => $value)
122        {
123             if($value['pid']==$pid)
124             {
125                 $value['level'] = $level;
126                 $newlist[] = $value;
127                 unset($list[$key]);
128                 getTree4($list, $value['id'], $level+1);
129             }
130        }
131        return $newlist;
132   }
原文地址:https://www.cnblogs.com/onlycat/p/7233627.html