php 擷取ip:php高效擷取樹結構資訊
來源:互聯網
上載者:User
在開發中,經常有一些簡單的樹形結構的儲存,比如產品的多級分類,多級導覽列菜單等,這些物體有一個特性,就是通常會擷取整棵樹結構。在資料庫裡儲存樹結構的方法主要有三種,最簡單的一就是通過一個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;
}
} 本文連結http://www.cxybl.com/html/wlbc/Php/20120607/28514.html