【问题标题】:Hierarchical recursion menu with PHP/MySQL使用 PHP/MySQL 的分层递归菜单
【发布时间】:2010-10-11 01:26:13
【问题描述】:

这应该(希望)对你们中的一些人来说是一个很容易回答的问题。

我有一个来自 mySQL 数据库的有效递归菜单,现在我的主要问题是:

创建 URL 的最佳方法是什么?我更愿意引入每一行的标题,例如 /eggs/milk/bacon/。 0 级的鸡蛋,例如:eggs-0、milk-1、bacon-2。关于如何动态输出这个有什么想法吗?

我很喜欢“cletus”在这个问题上说了几句: PHP/MySQL - building a nav menu hierarchy

但是我需要更多关于如何做的解释。

【问题讨论】:

  • 您在创建 Cletus 帖子中描述的无序列表的 URL 部分时遇到问题吗?
  • 正确,URL 部分。我不知道如何让它们堆叠,/one/two/three/ etc..

标签: php mysql recursion


【解决方案1】:

除非您计划经常修改您的菜单树,否则为每个菜单项预先存储所需的分层 URL 可能是最简单的(对于运行时解析)。

如果您希望树经常被修改,比方说 - 通过网络界面,那么每次阅读菜单时生成路径会更容易,如下所示:

 id | name   | parent
----+--------+-------
 0  | eggs   | NULL
 1  | milk   | 0
 2  | bacon  | 1
 3  | tomato | 0
 4  | lettuce| 1

foreach (query("SELECT * FROM menu ORDER BY parent ASC") as $row) {
  $menuitem = array_merge(array(), $row);
  $menuLookup[$menuitem['id']] &= $menuitem;
  if ($menuitem['parent'] == null) {
    $menuitem['path'] = "/" . $menuitem['name'];
    $menu[] &= $menuitem[];
  } else {
    $parent &= $menuLookup[$menuitem['parent']];
    $menuitem['path'] = $parent['path'] . "/" . $menuitem['name'];
    $parent['menu'][] &= $menuitem;
  }
}

我没有调试过这段代码,只是测试了它的正确性;-)

【讨论】:

  • 我应该说我不是 php 专业人士,但据我所知,你基本上是在说“如果 'parent' 存在,那么将 'name' 放入 parent['path'] 数组然后继续?所以这最终会导致 /milk/bacon/ 等?
  • 不完全是 - $menu 最终会通过将子项放入其父项的 'menu' 数组中来保存菜单项的层次结构。这是标准的“取消我的列表”。
  • 这里唯一的噱头是通过在当前名称前面加上父级的“路径”来构成“路径”,然后从父级的总和递归地构建每个子级的路径。
  • 太棒了,感谢您的帮助!我会看看我能做什么。我仍在学习如何正确使用数组,我试图只使用一个变量来递归地“堆叠”路径值。但显然它只会覆盖自己(我想,哈哈!)。
  • 请注意使用 &= 来获取对数组的引用,而不是简单的 = 。原因是我不想复制数组内容 - 我想使用相同的实例,这样当我为它分配数据时,所有引用都会看到它。
【解决方案2】:

好吧,如果你想要一个层次结构,最好的方法是我所知道的称为“修改的预序树遍历”,详细描述了 in this Sitepoint article,大约从一半开始。

与 Guss 建议的主要区别在于,它的性能更高,并且只获取您正在寻找的树的一部分更容易。

【讨论】:

  • 感谢您的信息!在开始这个项目之前,我确实检查了这两种方法,但是我要处理的最多行数是 75 max,所以 Tree Traversal 似乎有点矫枉过正。但是,我现在看到树遍历会给我更多的控制权。 叹息。
【解决方案3】:
猜你喜欢
  • 1970-01-01
  • 2018-12-17
  • 2011-09-17
  • 2013-11-05
  • 2013-06-13
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多