【问题标题】:Multilevel menu from database records来自数据库记录的多级菜单
【发布时间】:2013-02-10 08:21:48
【问题描述】:

我需要一些关于 PHP 的帮助。我有一个可以正常工作的多级 css 菜单,但现在我想根据数据库中的记录生成。

菜单代码:

<div id="page-wrap">
    <ul class="dropdown">
        <li><a href="#">Link 1</a> </li>
        <li><a href="#">Link 2</a> </li>
        <li><a href="#">Link 3</a> </li>
        <li><a href="#">Link 4</a>
        <ul class="sub_menu">
            <li><a href="#">Link 4 - 1</a></li>
            <li><a href="#">Link 4 - 2</a></li>
            <li><a href="#">Link 4 - 3</a></li>
        </ul>
        </li>
        <li><a href="#">Link 5</a></li>
        <li><a href="#">Link 6</a> </li>
    </ul>
</div>

在数据库中,每条记录都有一个名为 ma​​in_manu 的字段,如果该字段的值为 Yes,并且该值为 ,则该字段将成为主链接否,然后它有另一个字段 (sub_menu) 表示应该放置此链接的父菜单。!请参阅屏幕截图。 DB Fields

所以,现在我不知道如何做将获取记录的 php 片段,如果 main_menu 的值为 yes,它将创建一个顶级菜单,如果 ma​​in_menu 的值否,会根据sub_menu字段的值创建一个子级菜单。

非常感谢

更新

这是我到目前为止的代码,它可以工作。如果我可以使用单个查询而不是多个嵌套查询,那就太好了。

<div id='page-wrap'>
    <ul class='dropdown'>
<?

$sql_menu = "SELECT * FROM content WHERE visible = '1' and main_menu='yes' ";
$result_menu = mysql_query($sql_menu); 
while($row = mysql_fetch_assoc($result_menu))
 {
$id=$row['id'];
$menu_top=$row['menu_name'];
$menu_url=$row['menu_url'];

print "<li><a href='$menu_url'>$menu_top</a>";

$sql_sub = "SELECT * FROM content WHERE sub_menu = '$menu_url' ";
$result_sub = mysql_query($sql_sub);
$num_rows = mysql_num_rows($result_sub);

while($row = mysql_fetch_assoc($result_sub))
 {
$id=$row['id'];
$menu_sub=$row['menu_name'];
$sub_url=$row['menu_url'];
If ($num_rows != 0)
{
print "<ul class='sub_menu'>
            <li><a href='$sub_url'>$menu_sub</a></li>
       </ul>";
}
}
print "</li>";
}
?>
</ul>
</div>

【问题讨论】:

  • 实际上,您不需要 main_menu 字段,因为您可以将任何具有空白 sub_menu 字段的内容作为主菜单的一部分。
  • 您能列出您的数据库表中的字段并包含一些示例行吗?
  • 主帖中的链接数据库字段指向我的数据库字段的屏幕截图

标签: php mysql


【解决方案1】:

此代码将类似于以下内容(无论您与数据库交互的方式等,都需要更改此代码):

// Here we do a query to get all the rows from the table
$db_result = db_execute_query('SELECT * FROM `menu_table` ORDER BY `order_no`');

// Here we take the rows and put it into a structured array
$items = array();
$hierarchy = array('' => array());
while ($row = db_fetch_row($db_result)) {
    $items[$row['menu_name']] = $row['menu_name_en'];
    if ($row['main_menu'] == 'yes') {
        $hierarchy[''][] = $row['menu_name'];
    } else {
        if (!isset($hierarchy[$row['sub_menu']]) {
            $hierarchy[$row['sub_menu']] = array();
        }
        $hierarchy[$row['sub_menu']][] = $row['menu_name'];
    }
}

// Here we define a recursive function to run through our $hierarchy array;
function show_menu($name = '') {
    if (isset($hierarchy[$name])) {
        if ($name == '') {
                echo '<ul class="dropdown">';
        } else {
                echo '<ul class="sub_menu">';
        }

        foreach ($hierarchy[$name] as $sub) {
            echo '<li><a href="#">' . $items[$sub] . '</a>';
            show_menu($sub);
            echo '</li>';
        }

        echo '</ul>';
    }
}

// Here we execute the recursive function on the main menu
show_menu('');

试着理解我在这里做什么,而不是一字不差地实现它。一旦您了解了递归函数,就会为您打开一个全新的世界。

另外请注意,您的 db 表可以更改以使此代码更简单

【讨论】:

  • 谢谢。我需要一些时间才能发现这个新世界。现在我只用一个嵌套查询来实现它,但肯定会测试你的建议并理解其中的流程。
【解决方案2】:

【讨论】:

  • 我查看了您发送给我的链接...但我有点迷路了...我想我总是可以通过两个单独的查询来做到这一点,但如果我能提出一些逻辑就好了在后面。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2016-09-23
  • 2015-05-21
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多