生成樹的時候,數據庫中通常設計的都爲無級數,即爲:父子節點的樹,例如:基本的數據表設計爲:node
nodecode 節點編碼數據庫
parentnodecode 父節點編碼json
nodename 節點名稱ui
這樣的形式,在生成樹的時候,根據子找父,再找爺爺的關係,一直找到最頂級,來肯定一個從屬關係,若是由父級找子級再找孫子級,那麼,就能夠有無限個孩子級,因此這種狀況,適合不限分類的一種寫法,可是這種寫法帶來的結果就是,效率比較低,處理的時間長,因此在開發過程當中,就出現了一種編碼樹的形式:基本的數據表設計爲:this
nodecode 節點編碼編碼
nodename 節點名稱spa
這種編碼樹,子節點,帶着父節點的信息,好比說節點編碼爲:001 名稱爲:1級 節點編碼爲:001001 名稱爲:1_1級,今後能夠看出,我只要看到001001就能知道他的父級是誰,也能知道他的子集是誰,在數據庫中只要使用 likt '001001%',便可獲得,以nodecoder的長度爲varchar(30)爲例,則最多產生10個子集,即001001001001001001001001001001這樣的關係,若是以3位長度爲一個節點的長度,則可產生999個同級分類,若是以4個節點長度,則可產生9999個節點,因此隨着每一個節點的長度的增加,能夠容納更多的節點和子集,此適合不是無限級分類的使用。設計
使用無級樹,在網上有許多生成easyui中tree使用Json的方法,下面這樣方法是根據編碼生生成json的方式,僅爲簡單的一個實現:code
1 public function getTree($root,$text="typename",$value="typecode", $fileLength = 3) {
2 $childNode = array(); 3 foreach ($root as $key=>$node) { 4 unset($childNode); 5 foreach ($root as $k => $v) { 6 if ($this->startWith($v["typecode"], $node["typecode"]) && $v["typecode"] != $node["typecode"]) { 7 $childNode[] = $v; 8 } 9 } 10 $treeNode = array(); 11 if (strlen($node["typecode"]) == $fileLength) { 12 $treeNode['children'] = $this->getTree($childNode,$text,$value, $fileLength + 3); 13 $treeNode["id"] = $node[$value]; 14 $treeNode["text"] = $node[$text]; 15 $treeNode["value"] = $node[$value]; 16 $treeNode["checked"] = "false"; 17 // $node["attributes"] = $node; 18 $treeNode["state"] = "open"; 19 $tree[] = $treeNode; 20 } 21 } 22 return $tree; 23 } 24 private function startWith($str, $needle) { 25 return strpos($str, $needle) === 0; 26 }