一、数据库设计
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 }