PHP - SQL制作带子菜单的菜单

时间:2012-07-02 14:14:29

标签: php sql menu

Hy,

标题说明了,我想制作一个带有子菜单的菜单。

这样的事情:

  • parent1
    1. sub2
      1. sub 3
  • parent2

我已经有了这个,但代码看起来并不好看。

那么我如何改进我的代码,或者你知道它更好,然后发布它。

这是代码:

<?php

$le_content .= '<div id="main_menu">';


$sQuery_get_all_parents = " SELECT
                            menu.id,
                            menu.`name`,
                            menu.url,
                            menu.parent_id
                            FROM `menu`
                            WHERE
                            menu.actif = 1 AND
                            menu.parent_id = 0
                            ORDER BY
                            menu.volgorde ASC";
$rResultaat_get_all_parents = mysql_query($sQuery_get_all_parents) or die(mysqlError($sQuery_get_all_parents));

$menu_parents = array();
$menu_child_1 = array();
$counter = 0;
$counter_child_1 = 0;
$counter_child_2 = 0;

while($row = mysql_fetch_assoc($rResultaat_get_all_parents)){
    $menu_parents[$counter]['id'] = $row['id'];
    $menu_parents[$counter]['name'] = $row['name'];
    $menu_parents[$counter]['url'] = $row['url'];
    $menu_parents[$counter]['parent_id'] = $row['parent_id'];
    $counter++;
}

$le_content .= '<ul id="main_menu_ul">';
foreach ($menu_parents as $menu_entry => $value) {
    $le_content .= '<li><a href="'.ROOT_HREF.$value['url'].'" >'.$value['name'].'</a>';
    $sQuery_get_first_children = "  SELECT
                                    menu.id,
                                    menu.`name`,
                                    menu.url,
                                    menu.parent_id
                                    FROM `menu`
                                    WHERE
                                    menu.actif = 1 AND
                                    menu.parent_id = ".$value['id']."
                                    ORDER BY
                                    menu.volgorde ASC";
    $rResultaat_get_first_children = mysql_query($sQuery_get_first_children) or die(mysqlError($sQuery_get_first_children));
    $row_count = mysql_num_rows($rResultaat_get_first_children);

    if($row_count != false){
        $le_content .= '<ol>';
        while($row = mysql_fetch_assoc($rResultaat_get_first_children)){
            $menu_child_1[$counter_child_1]['id'] = $row['id'];
            $menu_child_1[$counter_child_1]['name'] = $row['name'];
            $menu_child_1[$counter_child_1]['url'] = $row['url'];
            $menu_child_1[$counter_child_1]['parent_id'] = $row['parent_id'];
            $counter_child_1++;
        }

        foreach ($menu_child_1 as $menu_entry_child_1 => $value_child_1) {
            $le_content .= '<li><a href="'.ROOT_HREF.$value_child_1['url'].'" >'.$value_child_1['name'].'</a>';
            $sQuery_get_second_children = " SELECT
                                            menu.id,
                                            menu.`name`,
                                            menu.url,
                                            menu.parent_id
                                            FROM `menu`
                                            WHERE
                                            menu.actif = 1 AND
                                            menu.parent_id = ".$value_child_1['id']."
                                            ORDER BY
                                            menu.volgorde ASC";
            $rResultaat_get_second_children = mysql_query($sQuery_get_second_children) or die(mysqlError($sQuery_get_second_children));
            $row_count = mysql_num_rows($rResultaat_get_second_children);
            if($row_count != false){
                $le_content .= '<ol>';
                while($row = mysql_fetch_assoc($rResultaat_get_second_children)){
                    $menu_child_2[$counter_child_2]['id'] = $row['id'];
                    $menu_child_2[$counter_child_2]['name'] = $row['name'];
                    $menu_child_2[$counter_child_2]['url'] = $row['url'];
                    $menu_child_2[$counter_child_2]['parent_id'] = $row['parent_id'];
                    $counter_child_2++;
                }
                foreach ($menu_child_2 as $menu_entry_child_2 => $value_child_2) {
                    $le_content .= '<li><a href="'.ROOT_HREF.$value_child_2['url'].'" >'.$value_child_2['name'].'</a></li>';
                }
                $le_content .= '</ol>';
            }

            $le_content .= '</li>';
        }
        $le_content .= '</ol>';
    }
    $le_content .= '</li>';
}

$le_content .= '</ul></div>';

?>

最后,我回复$ le_content .....

2 个答案:

答案 0 :(得分:4)

  1. 查询所有菜单项
  2. 构建它们的分层数组(创建一个递归函数)每个menuitem应该有一个属性为它的子集合
  3. 创建另一个递归函数来编写输出

答案 1 :(得分:0)

好吧,我已经四处寻找,并提供了一个解决方案......让查询变得更好。我已经按照本教程进行了很好的工作:

sql and categories

感谢所有帮助;)