【问题标题】:menu with while and foreach loop带有 while 和 foreach 循环的菜单
【发布时间】:2017-03-13 18:12:43
【问题描述】:

我对目前的 PHP 知识感到困惑。我想制作一个菜单,将信息存储到数据库中。我想要达到的目标如下:

<?php
$names= array();
$aliases= array();
$items = array();
?>
<?php while($row = mysqli_fetch_array($menu, MYSQLI_ASSOC)){
    $names[] = $row['page'];
    $aliases[] = $row['alias'];
    $items[] = $row['item'];
}?>

<div id="menu">
    <ul>
        <?php foreach($names as $page_name){
            <a href="*** HERE THE ALIAS CORRESPONDING WITH THE NAME***"><?php echo $page_name;?></a>
        ?>
        *** IF THERE ARE SUB MENU ITEMS, SHOW THEM ***
        <ul>
            <li>
                <a href="*** ALIAS OF SUB ITEM ****">*** NAME OF SUB ITEM***</a>
            </li>
        </ul>
    </ul>
</div>

我完全不知道我是否在正确的垫子上。 foreach 仅适用于名称或别名,但我想将它们组合起来。然后我想检查是否有悬停的子菜单,还要将父项设置为“活动”类。

由于我很难用英语解释它,请问我任何需要的问题,以便我提供更多信息。

提前致谢!

【问题讨论】:

  • 请提供更多信息。我们不知道“子菜单”是什么,也不知道您希望页面是什么样子。
  • 能否请您与页面上的静态项目共享代码?举个例子。

标签: php loops foreach while-loop


【解决方案1】:

你把事情复杂化了:

<?php 

echo '<div id="menu">
        <ul>';
while($row = mysqli_fetch_array($menu, MYSQLI_ASSOC)){
    $names[] = $row['page'];
    $aliases[] = $row['alias'];
    $items[] = $row['item'];

    echo '<li class="pagename"><a href="'.$row['alias'].'">'.$row['page'].'</a>';

    if ('checkforsubitem') {
        echo '<ul>
                <li>
                    <a href="'.$row['alias_subitem'].'">'.$row['name_of_subitem'].'</a>
                </li>
            </ul>';
    }
}
    echo '</li>
    </ul>
</div>';

?>

但是,这假设了一些关于子菜单位的事情。通常,您可以在同一查询中获取这些项目,并通过$row 提供给您,但您也可以根据来自$row['id'] 的连接或其他东西对这些项目进行单独查询,然后提取这些子项目对应于该 id,然后围绕辅助 &lt;li&gt;-items 运行另一个 while-loop。

【讨论】:

  • 很高兴您能理解我的问题。但是我现在正在运行一个类似的代码,有人告诉我不可能以这种方式将父母置于活动状态,因为父母不知道孩子是否在活动页面上。
  • 呃,什么?父/子关系需要一些工作,或者混合存在代码问题或数据库问题。由于您要从数据库中获取整个菜单,因此关系应该在数据库中,并且正确获取应该没有问题。
  • 现在,有一个名为“item”的字段,如果它在菜单中则存储“true”,或者如果它是子项,则存储“[父项的名称]”。孩子知道它有一个父母,但父母不知道它有一个孩子。那么这是数据库中的错误结构吗?
  • 嗯,是的。每个菜单项(父项或子项)都应该有一个 ID - 一个数字 ID。然后,如果您有一个孩子,该 chlid 将获得指向父母 ID 的链接。例如,您有一个名为is_child 的列,它是一个boolean(即1 或0),然后您有一个名为parent_id 的列,它在其中获取父ID。这样你就可以通过调用SELECT * FROM menu_table WHERE is_child = 1 AND parent_id = :parentID 拉所有的孩子。这是数据库 101。
  • 现在,它就是这样构建的。但问题是,没有任何东西存储在父母中知道它有一个孩子。孩子有父母的ID,所以它知道在哪里表演。但如果你在孩子的页面上,我想让父母处于活动状态。
【解决方案2】:

首先,您不需要三个不同的数组,只需要$names 数组就足够了。其次,按以下方式更改您的while()循环,

while($row = mysqli_fetch_array($menu, MYSQLI_ASSOC)){
    $names[] = array('page_name' => $row['page'], 'alias' => $row['alias'], 'item' => $row['item']);
}

这将创建一个包含名称、别名和子项的多维数组。

最后,按以下方式显示整个菜单

<div id="menu">
    <ul>
        <?php foreach($names as $page_array){ ?>
            <a href="<?php echo $page_array['alias']; ?>"><?php echo $page_array['page_name']; ?></a>
            <?php
                if(!empty($page_array['item'])){
                    ?>
                    <ul>
                        <li>
                            <a href="<?php echo $page_array['item']; ?>"><?php echo $page_array['item']; ?></a>
                        </li>
                    </ul>
                    <?php
                }
        } ?>
    </ul>
</div>

【讨论】:

  • 这样的多维数组对我来说是新的。它就像一个魅力。不幸的是,我的其他解决方案走在了正确的道路上,所以我不会实施它,但仍然是正确的答案!
  • @Saypontigohe 很高兴我能帮上忙。 干杯! ;-)
猜你喜欢
  • 2015-06-16
  • 2013-08-31
  • 2012-07-01
  • 2020-08-23
  • 2018-05-20
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
相关资源
最近更新 更多