一、數據庫設計
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 }