【问题标题】:PHP Database driven Multilevel MenuPHP 数据库驱动的多级菜单
【发布时间】:2015-07-06 23:38:04
【问题描述】:

我想构建一个数据库驱动的多级菜单,我从 [http://abhijitpal.in/][1] 得到它,但这里的问题是我不能把 class = "dropdown" 只放在顶部菜单 <ul> 上,它也适用于子菜单也是。我只是稍微修改了一下,但我不知道如何使用递归函数。下面是代码,看看能不能帮忙

<?php     /** Function to display Catelogue Menu */

//select all rows from the main_menu table
$q ="SELECT * FROM catelogue WHERE cat_visibility = '1'";    
$r = mysqli_query($dbc, $q);

//create a multidimensional array to hold a list of menu and parent menu
$menu = array(
    'menus' => array(),
    'parent_menus' => array()
);

//build the array lists with data from the menu table
while ($row = mysqli_fetch_assoc($r)) {
    //creates entry into menus array with current menu id ie. $menus['menus'][1]
    $menu['menus'][$row['cat_id']] = $row;
    //creates entry into parent_menus array. parent_menus array contains a list of all menus with children
    $menu['parent_menus'][$row['cat_parentid']][] = $row['cat_id'];
}

    // Create the main function to build milti-level menu. It is a recursive function.  
    function nav_catelogue($parent, $menu) {
    //$html = "";
    if (isset($menu['parent_menus'][$parent])) { ?>
<ul>
        <?php
        foreach ($menu['parent_menus'][$parent] as $menu_id) {
            if (!isset($menu['parent_menus'][$menu_id])) { ?>
                <li><a href="<?php echo $menu['menus'][$menu_id]['link']; ?>"><?php echo $menu['menus'][$menu_id]['cat_name']; ?></a></li>
  <?php }
            if (isset($menu['parent_menus'][$menu_id])) { ?>
        <li><a href="#"><?php echo $menu['menus'][$menu_id]['cat_name']; ?></a>
                        <?php echo nav_catelogue($menu_id, $menu); ?>
                    </li>
            <?php }
        } ?>
     </ul>
<?php }

} 
?>

我的数据库结构是

-----------------------------------------
| cat_id   | cat_name    | cat_parentid |
-----------------------------------------
|  1       |  Home       |  0           |
|  2       |  About      |  0           |
|  3       |  Contact    |  0           |
|  4       |  History    |  2           |
|  5       |  Services   |  2           |
-----------------------------------------

我想要的输出:

  • 首页
  • 关于
    • 历史
    • 服务
  • 联系方式

这是@Mave 的最终代码

<?php     /** Function to display Catelogue Menu */

//select all rows from the main_menu table
$q ="SELECT * FROM catelogue WHERE cat_visibility = '1'";    
$r = mysqli_query($dbc, $q);

//create a multidimensional array to hold a list of menu and parent menu
$menu = array(
    'menus' => array(),
    'parent_menus' => array()
);

//build the array lists with data from the menu table
while ($row = mysqli_fetch_assoc($r)) {
    //creates entry into menus array with current menu id ie. $menus['menus'][1]
    $menu['menus'][$row['cat_id']] = $row;
    //creates entry into parent_menus array. parent_menus array contains a list of all menus with children
    $menu['parent_menus'][$row['cat_parentid']][] = $row['cat_id'];
}

    // Create the main function to build milti-level menu. It is a recursive function.  
    function nav_catelogue($parent, $menu, $top = false) {
        if (isset($menu['parent_menus'][$parent])) {
            //this is short code for if($top === true) { //do true } else { //do false }
            echo $top ? '<ul class="dropdown">' : '<ul>';
            foreach ($menu['parent_menus'][$parent] as $menu_id) {
                if (!isset($menu['parent_menus'][$menu_id])) {
                    echo '<li><a href="' . $menu['menus'][$menu_id]['link'] . '">' . $menu['menus'][$menu_id]['cat_name'] . '</a></li>';
                }
                if (isset($menu['parent_menus'][$menu_id])) {
                    echo '<li><a href="#">' . $menu['menus'][$menu_id]['cat_name'] . '</a>' . nav_catelogue($menu_id, $menu) . '</li>';
                }
            }
            echo '</ul>';
        }
    }
?>

【问题讨论】:

    标签: php mysql menu


    【解决方案1】:
    function nav_catelogue($parent, $menu, $top = false) {
        if (isset($menu['parent_menus'][$parent])) {
            //this is short code for if($top === true) { //do true } else { //do false }
            echo $top ? '<ul class="dropdown">' : '<ul>';
            foreach ($menu['parent_menus'][$parent] as $menu_id) {
                if (!isset($menu['parent_menus'][$menu_id])) {
                    echo '<li><a href="' . $menu['menus'][$menu_id]['link'] . '">' . $menu['menus'][$menu_id]['cat_name'] . '</a></li>';
                }
                if (isset($menu['parent_menus'][$menu_id])) {
                    echo '<li><a href="#">' . $menu['menus'][$menu_id]['cat_name'] . '</a>' . nav_catelogue($menu_id, $menu) . '</li>';
                }
            }
            echo '</ul>';
        }
    }
    

    当您第一次调用 nav_catelogue(当前代码中不存在)时,请使用 nav_catelogue($menu_id, $menu, true); 调用它

    【讨论】:

    • 非常感谢您的回答....但是您能解释一下,首先您制作了 ` $top=false ` 并要求在第一次通话时将其设置为 true。它会做什么。仅据我所知
    • 这是我得到的输出 &lt;ul class=dropdown"&gt;&lt;ul&gt;&lt;li&gt;Hisory&lt;/li&gt;&lt;li&gt;Services&lt;/li&gt;&lt;/ul&gt; 第一个 &lt;ul&gt; 中没有列表项。这并没有激活应用于该类的 javascript。请帮忙
    • $top = false 的意思是,如果你不给函数第三个变量,它将默认为 false。只有在一种情况下,您希望它为真:当它第一次被调用时。至于没有输出:我不知道。我的代码应该与您发布的代码相匹配。
    • 好的,我将使用您的新代码重新发布代码。请与您的代码匹配
    【解决方案2】:

    你有两种方法可以让你的递归函数放

    class="dropdown"
    

    第一种方法是采用调用/被调用者样式,您的调用函数将处理第一种情况(class="dropdown"),然后调用将处理一般情况的递归函数(没有 class="dropdown ")。

    添加一个您将在第一次调用时传输的参数(布尔值?),它将添加 class="dropdown"。在递归调用中,您将将此布尔值作为 false 传输(没有 class="dropdown" 插入)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 2012-07-01
      • 2014-02-13
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      相关资源
      最近更新 更多