在開發中,經常有一些簡單的樹形結構的存儲,比如產品的多級分類,多級導航欄菜單等,這些物體有一個特性,就是通常會獲取整棵樹結構。在資料庫裡保存樹結構的方法主要有三種,最簡單的一就是透過一個father_id指向目前結構的父節點。對於這樣的小結構,一般我們會使用最簡單的方式來儲存。
當要取得整棵樹結構,網路上一般用遞歸法,這種方式程式碼簡單易懂,但是缺點是需要執行多次資料庫查詢,而且後面幾次取得的元素數量很少甚至為0,效率很差。
其實,遇到這種情況,可以將所有的元素全部從資料庫取得出來,然後再根據取得的元素father_id建構樹狀結構,這樣就可以解決執行多次資料庫查詢的效能損耗。以下就以我在實際專案中取得多層導覽列選單中的函數進拋磚引玉了
/* 通过数据库获取所有元素,通过下面函数构造树形结构 */ private function getTree($menus) { $id = $level = 0; $menuobjs=array(); $tree = array(); $notrootmenu=array(); foreach($menus as $menu){ $menuobj=new stdClass(); $menuobj->menu=$menu; $id = $menu['id']; $level = $menu['father_id']; $menuobj->nodes = array(); $menuobjs[$id]=$menuobj; if ($level) { $notrootmenu[]=$menuobj; } else { $tree[] = $menuobj; } } foreach($notrootmenu as $menuobj){ $menu=$menuobj->menu; $id = $menu['id']; $level = $menu['father_id']; $menuobjs[$level]->nodes[]=$menuobj; } return $tree; } }