当前位置: 首页 > 知识库问答 >
问题:

递归函数,仅显示父级、子级和同级的动态菜单

燕翔飞
2023-03-14

我需要从数据库显示菜单的帮助。以下是数据库表中的数组结果:

global $menuItems;
$menuItems = array(
[
    'id' => 1,
    'name' => 
    'Main Menu 1',
    'main' => 1,
    'parent_id' => null
],
['id' => 9,'name' => 'Main Menu 2','main' => 1,'parent_id' => null],
['id' => 10,'name' => 'Main Menu 3','main' => 1,'parent_id' => null],
['id' => 11,'name' => 'Sub Menu 1.1','main' => null,'parent_id' => 1],
['id' => 12,'name' => 'Sub Menu  1.2','main' => null,'parent_id' => 1],
['id' => 13,'name' => 'Sub Menu 1.3','main' => null,'parent_id' => 1],
['id' => 14,'name' => 'Sub Menu 1.2.1','main' => null,'parent_id' => 12],
['id' => 15,'name' => 'Sub Menu  1.2.1','main' => null,'parent_id' => 12],
['id' => 16,'name' => 'Sub Menu 3.1','main' => null,'parent_id' => 10,],
['id' => 17,'name' => 'Sub Menu 3.2','main' => null,'parent_id' => 10],
['id' => 18,'name' => 'Sub Menu 3.2.1','main' => null,'parent_id' => 17],
['id' => 19,'name' => 'Sub Menu 3.2.2','main' => null,'parent_id' => 17] );

我已经成功地从以下代码开发菜单树:

foreach ($menuItems as $menu) {
  $parentsIds[$menu['id']] = $menu['parent_id'];
}
function parseAndPrintTree($root, $tree) {
     global $menuItems;
     $return = array();
     if(!is_null($tree) && count($tree) > 0) {
        echo '<ul>';
        foreach($tree as $child => $parent) {
          if($parent == $root) {                    
            unset($tree[$child]);
            foreach ($menuItems as $row) {
                if($row['id'] == $child)
             echo "<li><a href='?menu=".$row['id']."'>".$row['name']. </a>";
            }    
            parseAndPrintTree($child, $tree);
            echo '</li>';
        }
    }
    echo '</ul>';
  }
}

parseAndPrintTree(0,$parentsIds);

它打印所需的输出。

我需要的是每次点击菜单,

  1. 其所有子项(如果有更多子项,则在单击之前不应打印)

“仅”将与父菜单id为0(而非子菜单)的其他主菜单一起打印在屏幕上。

我需要以下输出被生产。(步骤)。

在第一步1:

单击“主菜单1”时:

单击“子菜单1.2”时:

单击“主菜单3”时

当点击"子菜单3.2"

我正在传递<代码>?菜单={$row['id']}用于获取父母和孩子,但不知道如何处理所有兄弟姐妹、父母和孩子。

我尝试比较$_GET['菜单']id在循环中与一个单独的函数,它只在一个级别上打印正常,但是当树深入第二个级别时,它的第一个父级(返回到根)将不会被打印。

我只需要在PHP中使用它,而不需要jQuery、Css(类)。因为我不想在屏幕上打印其他菜单,而不仅仅是隐藏它们。

共有1个答案

陈飞语
2023-03-14

既然你说过你希望代码在php中而不是JS JQuery中。我已经试过这个了。它迭代你的数组三次,在其中它建立了一个嵌套树。,你需要什么。

在这里定义您的数组$menuItem,然后继续下面的代码

<ul>
<?php
    foreach($menuItems as $menu)
    {
        if($menu['main'] == 1)
        {
        ?>
        <li>
            <a href='<?= '?activeMenu='.$menu['id'] ?>'><?php echo $menu['name']; ?></a>
            <?php
            if(isset($_GET['activeMenu']) && $_GET['activeMenu'] == $menu['id'])
            {
            ?>
                <ul>
                <?php
                foreach($menuItems as $submenu_level1)
                {
                    if($submenu_level1['parent_id'] == $_GET['activeMenu'])
                    {
                    ?>
                        <li>
                            <a href='<?= '?activeMenu='.$_GET['activeMenu'].'&activeSubMenu='.$submenu_level1['id'] ?>'><?php echo $submenu_level1['name']; ?>
                        <?php
                            if(isset($_GET['activeMenu']) && isset($_GET['activeSubMenu']) && $_GET['activeMenu'] == $menu['id'] && $_GET['activeSubMenu'] == $submenu_level1['id'])
                            {
                                foreach($menuItems as $submenu_level2)
                                {       
                                ?>
                                    <ul>
                                    <?php
                                        if($submenu_level2['parent_id'] == $_GET['activeSubMenu'])
                                        {
                                    ?>
                                            <li><a href='<?= $_SERVER['PHP_SELF'] ?>'><?php echo $submenu_level2['name']; ?></li>
                                    <?php
                                        }
                                    ?>
                                    </ul>
                                <?php
                                }
                            }
                        ?>
                        </li>
                    <?php
                    }
                }
                ?>
                </ul>
            <?php
            }
            ?>
        </li>
        <?php
        }
    }
?>
</ul>
 类似资料:
  • 问题内容: 我用这个文章为例(做出反应的方式),但它不是为我工作。请指出我的错误,因为我不明白怎么了。 这是我看到的错误: 未捕获的TypeError:this.props.onClick不是函数 这是我的代码: 提前致谢! 问题答案: 问题在于回调内部不引用React组件,因此是。 您可以通过将第二个参数传递给来显式设置值: 现在,回调 内部 的值与回调 外部 (即实例)的值相同。 这与Reac

  • 问题是要确定子数据的总和是否等于父数据。如果是,返回真,否则返回假。 下面是我的代码,在提交时出现错误。我知道这是一个简单的问题,但在编写了条件之后,我很难通过遍历所有左右节点来递归检查二叉树中每个节点的和条件。 请指导我,因为我哪里做错了。

  • 问题内容: 我将PHP和mySQL与Idiorm结合使用。那可能不相关。 我的PHP数组 这是父母与子女之间的关系。 0是根父级。 示例:根父级0有孩子33,孩子33有孩子27,孩子27有孩子71。 如果需要解决此问题,可以更改此数组结构。 我的分层结果 像这样,但作为一个数组… 信息 深度未知,可以无限。我尝试了foreach,但可能不是这样。 我自己的想法 一些递归功能? 一些while循环?

  • 问题内容: 我不知道如何选择查询递归。 如何使用SqlServer取得这样的结果 问题答案: 您需要使用递归公用表表达式。 在线上有很多有用的文章。 有用的链接 简单谈谈:SQL Server CTE基础 blog.sqlauthority:递归CTE 这是您的问题的解决方案:

  • 问题内容: 假设我们有3个Entities对象类: 如何使用JPA2.x(或hibernate)批注来: 父级删除时(一对多)自动删除所有子级 删除后自动从子级列表中删除子级(多对一) 儿童删除时(一对一)自动删除玩具 我正在使用Hibernate 4.3.5和mysql 5.1.30。 谢谢 问题答案: 如本文所述, 实体状态转换应从父级到子级联,而不是相反。 您需要这样的东西:

  • 问题内容: 在下面的例子中 我懂了 在我的数据库中,表中有数百万行,而且层次结构又深又宽,我对所有子级都不感兴趣。我可以派生出我感兴趣的孩子。因此,我想打开查询并向START WITH提供孩子ID。然后,我想递归输出父级,直到到达顶部。在我的情况下,顶部是id和parent_id相等的地方。这是我正在尝试的方法,但无法显示顶级父级。 这给了我 它没有输出AA。可以这样做吗?我希望不会在输出中将pa