2011-09-30 77 views
0

我的遞歸PHP函數看起來像那樣。它基於母子結構Php遞歸函數優化

function generateMenu($parent, $level, $menu, $db){ 
    $q = $db->query("select id, name FROM menu WHERE parent = '$parent' AND showinmenu='$menu'"); 
    if($level > 0 && $q->num_rows > 0){ 
    echo "\n<ul>\n"; 
    } 
while($row=$q->fetch_object()){ 
    echo "<li>"; 
    echo '<a href="?page=' . $row->id . '">' . $row->name . '</a>'; 
    //display this level's children 
    generateMenu($row->id, $level++, $menu, $db); 
    echo "</li>\n\n"; 
} 
    if($level > 0 && $q->num_rows > 0){ 
    echo "</ul>\n"; 
    } 
} 

它可以從數據庫表生成菜單,但我覺得它確實幫了什麼工作。有什麼需要優化?

+1

,而不是調用函數generateMenu幾次,你爲什麼不只是有一組ID叫了一次,一旦執行查詢。你只需要重寫查詢來獲得一個數組的輸入,並從數據庫中抓取該數組的所有記錄 –

+0

我無法弄清楚數組。 – demonoid

+0

@ TT13:檢查這個問題:http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database一些其他方法來存儲分層數據庫中的數據。 –

回答

0

我想擺脫一些像這樣的代碼:

function generateMenu($parent, $level, $menu, $db){ 

$q = $db->query("select id, name FROM menu WHERE parent = '$parent' AND  showinmenu='$menu'"); 

    if($level > 0 && $q->num_rows > 0){ 
    echo "\n<ul>\n"; 

while($row=$q->fetch_object()){ 
echo "<li>"; 
echo '<a href="?page=' . $row->id . '">' . $row->name . '</a>'; 
//display this level's children 
generateMenu($row->id, $level++, $menu, $db); 
echo "</li>\n\n"; 
} 

echo "</ul>\n"; 
    } 
} 
+0

此功能無法正常工作 – demonoid

0

我會節省很多數據庫查詢,而是做一個這樣的。這無疑將導致更好的性能:

function generateMenu($parent, $level, $menu, $db){ 
    $q = $db->query("select parent, id, name FROM menu WHERE showinmenu='$menu'"); 
    $elements = array(); 
    while($row=$q->fetch_object()){ 
    $elements[$row->parent][] = $row; 
    } 
    _generateMenu($parent, $level, $elements); 
} 
function _generateMenu($parent, $level, $elements){ 
    if (!array_key_exists($parent, $elements)){ 
    return; 
    } 
    if($level > 0){ 
    echo "\n<ul>\n"; 
    } 

    foreach($elements[$parent] as $row){ 
     echo "<li>"; 
     echo '<a href="?page=' . $row->id . '">' . $row->name . '</a>'; 
     //display this level's children 
     _generateMenu($row->id, $level+1, $elements); 
     echo "</li>\n\n"; 
    } 

    if($level > 0){ 
    echo "</ul>\n"; 
    } 
}