2011-09-30 84 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"; 
    } 
}