使用PHP生成无序列表+;来自MySQL数据库的CodeIgniter

使用PHP生成无序列表+;来自MySQL数据库的CodeIgniter,php,mysql,codeigniter,foreach,Php,Mysql,Codeigniter,Foreach,我正在尝试使用PHP以以下格式构建一个动态生成的无序列表。我正在使用CodeIgniter,但它可以是普通的php 这是我需要实现的最终输出 <ul id="categories" class="menu"> <li rel="1"> Arts &amp; Humanities <ul> <li rel="2"> Photography <ul>

我正在尝试使用PHP以以下格式构建一个动态生成的无序列表。我正在使用CodeIgniter,但它可以是普通的php

这是我需要实现的最终输出

<ul id="categories" class="menu">
<li rel="1">
    Arts &amp; Humanities
    <ul>
        <li rel="2">
            Photography
            <ul>
                <li rel="3">
                    3D
                </li>
                <li rel="4">
                    Digital
                </li>
            </ul>
        </li>
        <li rel="5">
            History
        </li>
        <li rel="6">
                        Literature
        </li>
    </ul>
</li>
<li rel="7">
    Business &amp; Economy
</li>
<li rel="8">
    Computers &amp; Internet
</li>
<li rel="9">
    Education
</li>
<li rel="11">
    Entertainment
    <ul>
        <li rel="12">
            Movies
        </li>
        <li rel="13">
            TV Shows
        </li>
        <li rel="14">
            Music
        </li>
        <li rel="15">
            Humor
        </li>
    </ul>
</li>
<li rel="10">
    Health
</li>
所以我知道我需要至少1个foreach循环来生成第一级类别

我不知道的是如何在每个循环中迭代,检查是否有家长,并以动态的方式这样做,这样就可以有一个无穷无尽的孩子树

谢谢你能提供的任何帮助

Tim

如果您要输出每个类别,那么我可能会分两步完成:

首先,从数据库中获取所有相关数据

$items = array();

$res = mysql_query(...);
while ($row = mysql_fetch_assoc($res)) {
 $items[$row['parent_id']][] = $row;
}
然后将所有项目按其父项分组。然后,您可以使用递归函数来处理所有这些问题:

function showMenu($items, $parent = null) {
 // Assuming root elements have parent_id of 0:
 $index = $parent == null ? '0' : $parent;

 if (empty($items[$index])) {
  // No children, don't output anything
  return;
 }

 echo '<ul', $parent == null ? ' id="categories" ... ' : '', '>';

 foreach ($items[$index] as $child) {
  echo '<li rel="', $child['id'], '">', htmlentities($child['cat_name']);
  showMenu($items, $child['id']);
  echo '</li>';
 }

 echo '</ul>';
}

showMenu($items);
函数显示菜单($items,$parent=null){
//假设根元素的父\u id为0:
$index=$parent==null?'0':$parent;
if(空($items[$index])){
//没有孩子,不要输出任何东西
返回;
}
回声';
foreach($items[$index]作为$child){
echo'
  • ”,htmlentities($child['cat_name']); showMenu($items,$child['id']); 回音“
  • ”; } 回声“”; } 展示菜单(项目);

    对菜单中的每个项递归调用该函数,并检查该项是否有子项。如果有,它会打印出相关的
  • 条目,然后再次调用自己来打印该项的子项。

    嘿,伙计,这太神奇了。效果很好。非常感谢您花时间制作并分享这些代码。我想知道是否有一种简单的方法可以使脚本足够通用,以便它可以处理多个列表(因此在DB中使用dd_id作为列表标识符)?再一次,非常感谢Tim@Tim-没问题。至于使其通用化,如何将初始位(用于构建$items数组)放在一个接受$id参数的函数中,然后修改SQL查询以选择dd_id=$id的位置?嘿,Chris,我和我的朋友一直在努力解决这个问题,但我想我最终弄糊涂了。你能(如果你有时间)举一个例子,说明我如何根据数据库中的dd_id字段生成列表吗?
    function showMenu($items, $parent = null) {
     // Assuming root elements have parent_id of 0:
     $index = $parent == null ? '0' : $parent;
    
     if (empty($items[$index])) {
      // No children, don't output anything
      return;
     }
    
     echo '<ul', $parent == null ? ' id="categories" ... ' : '', '>';
    
     foreach ($items[$index] as $child) {
      echo '<li rel="', $child['id'], '">', htmlentities($child['cat_name']);
      showMenu($items, $child['id']);
      echo '</li>';
     }
    
     echo '</ul>';
    }
    
    showMenu($items);