PHP/MySQL导航菜单 [英] PHP/MySQL Navigation Menu

查看:73
本文介绍了PHP/MySQL导航菜单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为分层的导航菜单栏创建一个功能.

I'm trying to create a function for a hierarchical navigational menu bar.

我希望能够拥有这样的东西...

I want to be able to have something like this...

<ul id="navigation">
<li><a href="#">Menu Item 1</a></li>
<li><a href="#">Menu Item 2</a></li>
    <ul>
        <li><a href="#">Sub Menu Item 1</a></li>
        <li><a href="#">Sub Menu Item 1</a></li>
    </ul>
<li><a href="#">Menu Item 3</a></li>
<li><a href="#">Menu Item 4</a></li>
</ul>

我正在使用此功能,但无法正常运行.它显示的是主要的父链接,而不是子链接.

I'm using this function, but it's not working properly like I'd like it to. It's showing the main parent links, but not the child links.

function build_navbar($pid,$sub=0)
{
    global $db;

    $query = $db->simple_select("navbar", "*", "pid='".$pid."'", array("order_by" => "disporder"));
    $menu_build = "<ul id=\"navigation\">\n";
    while($menu = $db->fetch_array($query))
    {   
        if($sub == 1)
        {
           $menu_build .= "<ul>\n";
           $menu_build .= "<li><a href=\"#\">".$menu['title']."</a></li>\n";
           $menu_build .= "</ul>\n";
        }
        else
        {
           $menu_build .= "<li><a href=\"#\">".$menu['title']."</a></li>\n";
        }
        build_navbar($menu['id'],1);
    }
    $menu_build .= "</ul>\n";

    return $menu_build;
}

也许有人可以帮助我解决此问题?谢谢.

Perhaps someone can help me fix this? Thanks.

---新更新---

Andy Groff,这是您的代码输出的内容:

Andy Groff, this is what your code is outputting:

<ul id="navigation">
    <li><a href="#">Home</a></li>
    <ul>
        <li><a href="#">Child Link</a></li>
        <li><a href="#">Child 2</a></li>
    </ul>
    <li><a href="#">Parent</a></li>
</ul>

但是,我需要对其进行修改,以便其输出如下:

However, I need it modified so it'll output like this:

<ul id="navigation">
    <li><a href="#">Home</a>
        <ul>
            <li><a href="#">Child Link</a></li>
            <li><a href="#">Child 2</a></li>
        </ul>
    </li>
    <li><a href="#">Parent</a></li>
</ul>

这就是现在的输出,安迪:

<ul id="navigation">
    </li>
    <li><a href="#">Home</a>
    </li>
    <ul>
        <li>
        <a href="#">Child Link</a>
        </li>
        <li><a href="#">Child 2</a>
    </ul>
    </li>
    <li><a href="#">Parent</a>
</ul>

推荐答案

我认为您的问题可能与以下事实有关:函数是递归的,但是您正在构建的字符串在函数顶部被重置每次,而不是再次传递给函数.另外,在最终迭代中,我看不到该子项将被设置回零的任何地方.此外,似乎您不需要查询每个单独的行.查询一次并构建整个菜单会更有效.我认为可以放弃递归.另外,我建议在您的数据中存储一个"sub"标志,而不是对给定的行是否是子菜单使用一些难以理解的php逻辑.我根据这些概念进行了修改,但不知道它是否有效,因为我没有/想要创建数据来对其进行测试:

I think your problem could have something to do with the fact that your function is recursive, but the string you're building gets reset at the top of your function each time, instead of being passed into the function again. Also, I don't see anywhere that sub will get set back to zero for your final iteration. Additionally, it seems like you shouldn't need to query for each individual row. It would be more effective to query once and build the whole menu. I think the recursion can be ditched. Also, I would recommend storing a "sub" flag in your data, instead of using some hard to understand php logic as to whether or not a given row is a sub menu. I made modifications based of these concepts, no idea if it works or not though since I don't have/want to create the data to test it:

function build_navbar()
{
    global $db;
    //first things first, i'd recommend putting a "sub" flag in your database. This example will use it.

    //start off by getting all of the rows. No need for recursion.
    $query = $db->simple_select("navbar", "*", "1", array("order_by" => "disporder"));
    $menu_build = "<ul id=\"navigation\">\n";

    //keep track of what level we're at
    $level = 1;

    while($menu = $db->fetch_array($query))
    {
      //get sub from data
      $sub = $menu['sub']

      //we need to go back to root level
      if($sub == 0 && $level == 2){
        $level--;
        $menu_build .= "</ul></li>\n";
      }
      else $menu_build .= "</li>\n";

      //we need to go up one level
      if($sub == 1 && $level == 1)
      {
        $level++;
        $menu_build .= "<ul><li>\n";
      }
      else $menu_build .= "<li>";
      //always print out a link
      $menu_build .= "<a href=\"#\">".$menu['title']."</a>\n";
    }
    $menu_build .= "</ul>\n";

    return $menu_build;
}

这篇关于PHP/MySQL导航菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆