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 }