加快PHP递归功能

时间:2014-10-12 07:09:04

标签: php mysql recursion drop-down-menu phpmyadmin

我试图通过使用递归从数据库中获取值来创建多级动态PHP菜单。但是,由于没有,页面速度越来越慢。数据库中的记录增加。目前,DB中只有大约15条记录。

以下是代码:

<div id="nav">
<?php
$menu_html='';
function render_menu($parent_id){
$con=mysqli_connect("localhost","root","","test");
    global $menu_html;
    $result=mysqli_query($con, "select * from menu where parent_id=$parent_id");
    if(mysqli_num_rows($result)==0) return;

    if($parent_id==0)
        $menu_html .= "<ul>";
    else
        $menu_html .= "<ul>";

    while($row=mysqli_fetch_array($result)){
        $menu_html .= "<li><a href=\"{$row['link']}\">{$row['label']}</a>";
        render_menu($row['id']);
        $menu_html .= "</li>";
    }
    $menu_html .= "</ul>";
    return $menu_html;
}
echo render_menu(0);
?>
</ul>
</div>

这就是我的数据库的样子:

enter image description here


enter image description here


请帮忙告诉我如何优化网页速度。

由于

4 个答案:

答案 0 :(得分:4)

您正在进行多个可以避免的数据库查询。

一次性获取所有内容并循环遍历行以构建菜单。您将拥有使用父ID构建嵌套数组所需的一切。

如果之后仍然很慢,你可以查看缓存数据库结果,甚至是整个渲染菜单。

最好在文件或内存中缓存它,并在编辑菜单项或向数据库中添加新项时专门删除缓存项,以便可以更新缓存。那么你不必过多担心你的缓存时间,你可以无限期地缓存它。

答案 1 :(得分:2)

我建议您学习嵌套集树:Managing Hierarchical Data in MySQL,它只启用1个选择/查询来构建菜单,而不需要递归函数调用。

答案 2 :(得分:0)

试试这个:

    <div id="nav">
        <?php
            $menu_html='';
            function render_menu()
            {
                global $menu_html;
                $con=mysqli_connect("localhost","root","","test");
                $result=mysqli_query($con, "SELECT * FROM menu ORDER BY parent_id ASC;");
                $menu = array();
                while($row=mysqli_fetch_array($result))
                {
                    if($row['parent_id'] == 0)
                    {
                        $menu[$row['id']] = array
                        (
                            'label' => $row['label'], 
                            'link' => $row['link'], 
                            'children' => array()
                        );
                    }
                    else
                    {
                        $menu[$row['parent_id']]['children'][] = array
                        (
                            'label' => $row['label'], 
                            'link' => $row['link']
                        );
                    }
                }
                $menu_html = '<ul>';
                foreach($menu as $menu_item)
                {
                    $menu_html .= '<li>';
                    $menu_html .= '<a href="'.$menu_item['link'].'">'.$menu_item['label'].'</a>';
                    if((bool)$menu_item['children'])
                    {
                        $menu_html .= '<ul>';
                            foreach($menu_item['children'] as $child)
                            {
                                $menu_html .= '<li>';
                                    $menu_html .= '<a href="'.$child['link'].'">'.$child['label'].'</a>';
                                $menu_html .= '</li>';
                            }
                        $menu_html .= '</ul>';
                    }
                    $menu_html .= '</li>';
                }
                $menu_html .= '</ul>';
                return $menu_html;
            }
            echo render_menu();
        ?>
    </div>

答案 3 :(得分:0)

感谢大家的指导,并向我展示了正确的前进道路。 我按照这个链接完成了它。

http://wizardinternetsolutions.com/articles/web-programming/dynamic-multilevel-css-menu-php-mysql

由于