如何将MySQL菜单项表制作成递归PHP div,用于网站导航



我正在尝试获得一个PHP函数,该函数将生成一个菜单div结构。

我正在使用Meekrodb连接MySQL。

Meekrodb将数据返回到阵列

$menu_results = DB::query("SELECT mi.id, mi.display, mi.parent_item, mi.sort
FROM ibtstl_menu_items mi
WHERE mi.state = 1 AND mi.fk_menu = 1
ORDER BY mi.sort");

所以$menu_results阵列有数据:

Array
(
[0] => Array
(
[id] => 1
[display] => Repertoire
[parent_item] => 0
[sort] => 1.0000
)
[1] => Array
(
[id] => 9
[display] => Search repertoire
[parent_item] => 1
[sort] => 1.0100
)
[2] => Array
(
[id] => 3
[display] => Add new chart
[parent_item] => 1
[sort] => 1.0500
)
[3] => Array
(
[id] => 4
[display] => Add new composer / lyricist
[parent_item] => 1
[sort] => 1.0501
)
[4] => Array
(
[id] => 5
[display] => Add new tag
[parent_item] => 1
[sort] => 1.0502
)
[5] => Array
(
[id] => 6
[display] => Reports
[parent_item] => 1
[sort] => 1.0800
)
[6] => Array
(
[id] => 7
[display] => Public repertoire list
[parent_item] => 6
[sort] => 1.0801
)
[7] => Array
(
[id] => 8
[display] => Gigs
[parent_item] => 0
[sort] => 3.0000
)
[8] => Array
(
[id] => 11
[display] => Search gigs
[parent_item] => 8
[sort] => 3.0010
)
[9] => Array
(
[id] => 10
[display] => Add new gig
[parent_item] => 8
[sort] => 3.0020
)
[10] => Array
(
[id] => 2
[display] => Videos
[parent_item] => 0
[sort] => 5.0000
)
[11] => Array
(
[id] => 12
[display] => Search videos
[parent_item] => 2
[sort] => 5.0010
)
[12] => Array
(
[id] => 13
[display] => Add new video
[parent_item] => 2
[sort] => 5.0200
)
)

我在这里和其他网站上看了几十个答案,但我似乎无法理解。

它可能分为两部分:我可能需要处理这个数组,以便子项是其父项中的数组?我看到这是一种方法。然后我需要一个递归函数来处理它,这样我就可以拥有

<div>
<a href="#">Repertoire</a>
<div>
<a href="#">Search repertoire</a>
<a href="#">Add new chart</a>
<a href="#">Add new composer / lyricist</a>
<a href="#">Add new tag</a>
<a href="#">Reports</a>
<div>
<a href="#">Public repertoire list</a>
</div>
</div>
<a href="#">Gigs</a>
<div>
<a href="#">Search gigs</a>
<a href="#">Add new gig</a>
</div>
<a href="#">Videos</a>
<div>
<a href="#">Search videos</a>
<a href="#">Add new video</a>
</div>  
</div>

任何帮助都将不胜感激!

感谢

查询中提到的$menu_results数组
echo "<div>";
$sunsubmenucount = 0;
foreach ($menu_results as $menu_results_key => $parent) 
{
if($parent['parent_item']==0)
{
echo"<a href='#'>".$parent['display']."</a>";
echo"<div>";
foreach ($menu_results as $submenu_key => $submenu_value) 
{
if($submenu_value['parent_item']==$parent['id'])
{
echo"<a href='#'>".$submenu_value['display']."</a>";
foreach ($menu_results as $sub_submenu_key => $sub_submenu_value) 
{
if($sub_submenu_value['parent_item'] == $submenu_value['id'] && array_search($submenu_value['id'], array_column($menu_results, 'parent_item')))
{
if($sunsubmenucount==0)
{
echo"<div>";
}
$sunsubmenucount ++;
echo"<a href='#'>".$sub_submenu_value['display']."</a>";
}
}
if($sunsubmenucount!=0)
{
echo"</div>";
$sunsubmenucount = 0;
}
}
}
echo"</div>";
}
}
echo "</div>";

希望这会有所帮助。

我最终找到的答案是:https://stackoverflow.com/questions/10782810/echo-menu-tree-with-recursive-function

ChildCount添加到所选

select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category
function recurse($categories, $parent = null, $level = 0)
{
$ret = '<ul>';
foreach($categories as $index => $category)
{
if($category['root'] == $parent)
{
$ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
if($category['ChildCount'] > 0)
$ret .= $this->recurse($categories, $category['id'], $level+1);
$ret .= '</li>';
}
}
return $ret . '</ul>';
}

将CCD_ 3改为CCD_ 4,去除CCD_。

递归地,所以可以在我的菜单中添加更多的层(如果需要的话(,它们会自动显示。

最新更新