gpt4 book ai didi

php - 如何通过PHP和mysql建立无限级菜单

转载 作者:可可西里 更新时间:2023-11-01 06:30:57 31 4
gpt4 key购买 nike

好吧,为了构建我的菜单,我使用了类似这样的数据库结构

  2  Services                  0  3  Photo Gallery             0  4  Home                      0  5  Feedback                  0  6  FAQs                      0  7  News & Events             0  8  Testimonials              0 81  FACN                      0 83  Organisation Structure   81 84  Constitution             81 85  Council                  81 86  IFAWPCA                  81 87  Services                 81 88  Publications             81

To assign another submenu for existing submenu I simply assign its parent's id as its value of parent field.parent 0 means top menu

now there is not problem while creating submenu inside another submenu

now this is way I fetch the submenu for the top menu

<ul class="topmenu">
<? $list = $obj -> childmenu($parentid);
//this list contains the array of submenu under $parendid
foreach($list as $menu) {
extract($menu);
echo '<li><a href="#">'.$name.'</a></li>';
}
?>
</ul>

我想做的是。

我想检查一个新菜单是否有其他子菜单

我想继续检查,直到它搜索到所有可用的子菜单

我想像这样在它的特定列表项中显示它的子菜单

<ul>       
<li><a href="#">Home</a>
<ul class="submenu">
........ <!-- Its sub menu -->
</ul>
</li>
</ul>

最佳答案

这是针对此问题的“一次查询无递归”解决方案的“开发人员友好”版本。

SQL:

SELECT id, parent_id, title, link, position FROM menu_item ORDER BY parent_id, position;

PHP:

$html = '';
$parent = 0;
$parent_stack = array();

// $items contains the results of the SQL query
$children = array();
foreach ( $items as $item )
$children[$item['parent_id']][] = $item;

while ( ( $option = each( $children[$parent] ) ) || ( $parent > 0 ) )
{
if ( !empty( $option ) )
{
// 1) The item contains children:
// store current parent in the stack, and update current parent
if ( !empty( $children[$option['value']['id']] ) )
{
$html .= '<li>' . $option['value']['title'] . '</li>';
$html .= '<ul>';
array_push( $parent_stack, $parent );
$parent = $option['value']['id'];
}
// 2) The item does not contain children
else
$html .= '<li>' . $option['value']['title'] . '</li>';
}
// 3) Current parent has no more children:
// jump back to the previous menu level
else
{
$html .= '</ul>';
$parent = array_pop( $parent_stack );
}
}

// At this point, the HTML is already built
echo $html;

您只需要了解 $parent_stack 变量的用法即可。

这是一个“后进先出”堆栈(后进先出)- 维基百科文章中的图像值(value)一千字:http://en.wikipedia.org/wiki/LIFO_%28computing%29

当菜单选项有子选项时,我们将其父 ID 存储在堆栈中:

array_push( $parent_stack, $parent );

然后,我们立即更新 $parent,使其成为当前菜单选项 ID:

$parent = $option['value']['id'];

在我们循环完它的所有子选项后,我们可以返回到上一层:

$parent = array_pop( $parent_stack );

这就是我们将父 ID 存储在堆栈中的原因!

我的建议是:思考上面的代码片段,并理解它。

欢迎提问!

我在这种方法中看到的一个优点是它消除了进入无限循环的风险,这种情况在使用递归时可能会发生。

关于php - 如何通过PHP和mysql建立无限级菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2871861/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com