从mysql数据库到ul li(PHP)的菜单

从mysql数据库到ul li(PHP)的菜单,php,arrays,menu,recursive-query,Php,Arrays,Menu,Recursive Query,我有一个mysql表格菜单,看起来像这样 id int 子ID int 名称varchar 如果是顶级菜单点,subid为0;如果是sub,则从上面的菜单点获取id 数据可能是 1,0,前1名 2,0,前2名 3,0,前3名 4、2、子2、1 5、2、子2、2 第6、5、2、2、1子类 第7、5、2、2子类 8、3、子3、1 我希望它以这样的ul li列表结束 <ul> <li>Top 1</li> <li>Top 2 <ul>

我有一个mysql表格菜单,看起来像这样 id int 子ID int 名称varchar

如果是顶级菜单点,subid为0;如果是sub,则从上面的菜单点获取id

数据可能是

1,0,前1名

2,0,前2名

3,0,前3名

4、2、子2、1

5、2、子2、2

第6、5、2、2、1子类

第7、5、2、2子类

8、3、子3、1

我希望它以这样的ul li列表结束

<ul>
<li>Top 1</li>
<li>Top 2
  <ul>
  <li>Sub 2,1</li>
  <li>Sub 2,2
      <ul>
      <li>SubSub 2,2,1</li>
      <li>SubSub 2,2,2</li>
      </ul>
  </li>
  </ul>
</li>
<li>Top 3
  <ul>
  <li>Sub 3,1</li>
  </ul>
</li>
</ul>
<?php foreach( $array as $ul => $li ) {
 if( $li['subid') != 0 ) {
   foreach($li['child'] as $ul2 => $li2) {
    echo '<li>' . $li2['name'] . '</li>';
   }
 } else {
  echo '<li>' . $li['name'] . '</li>';
 }
?>
我发现了一个递归函数,但它在每个菜单点上运行sql查询,这可能会给服务器带来内存问题

做菜单最聪明的方法是什么? 我应该先选择数组中的所有数据,还是怎么做? 如果,我怎么能做到


期待您的回答-如果我解释得不够好,请随时提问:

将所有数据放入数组,然后从中生成二维数组。最后,遍历所有项/键

像这样的

<ul>
<li>Top 1</li>
<li>Top 2
  <ul>
  <li>Sub 2,1</li>
  <li>Sub 2,2
      <ul>
      <li>SubSub 2,2,1</li>
      <li>SubSub 2,2,2</li>
      </ul>
  </li>
  </ul>
</li>
<li>Top 3
  <ul>
  <li>Sub 3,1</li>
  </ul>
</li>
</ul>
<?php foreach( $array as $ul => $li ) {
 if( $li['subid') != 0 ) {
   foreach($li['child'] as $ul2 => $li2) {
    echo '<li>' . $li2['name'] . '</li>';
   }
 } else {
  echo '<li>' . $li['name'] . '</li>';
 }
?>

您不必为每个项目进行连接,只需将整个表下载到一个数组中,然后进行排序。我遇到的问题是子菜单:如何区分它们与顶部链接?解决方案是添加“parent”和“hasChild”列以报告适当的顶部链接,并为hasChild添加0或1,然后使用

函数将类似于

function myFunc(,$parent,$isSub){
 //database stuff. I use PDO
 while($arr = $stmt->fetch(PDO::FETCH_ASSOC)){
  if($parent===$arr['parent']){
    //make top links
    if($arr['hasSub']===1 && $isSub===1){
      //make subs
      myFunc($arr,$arr['parent'],0)
    }
  }
 }
}