使用 PHP + CodeIgniter 从 MySQL 数据库生成无序列表

Posted

技术标签:

【中文标题】使用 PHP + CodeIgniter 从 MySQL 数据库生成无序列表【英文标题】:Generating Unordered List with PHP + CodeIgniter from a MySQL Database 【发布时间】:2011-02-23 11:10:42 【问题描述】:

我正在尝试使用 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>

这是我必须使用的 SQL。

--
-- Table structure for table `categories`
--

CREATE TABLE IF NOT EXISTS `categories` (
  `id` mediumint(8) NOT NULL auto_increment,
  `dd_id` mediumint(8) NOT NULL,
  `parent_id` mediumint(8) NOT NULL,
  `cat_name` varchar(256) NOT NULL,
  `cat_order` smallint(4) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

所以我知道我将需要至少 1 个 foreach 循环来生成第一级类别。

我不知道如何在每个循环中进行迭代并检查父级并以动态方式执行此操作,这样就可以生成无穷无尽的子级树。

感谢您提供的任何帮助。

提姆

【问题讨论】:

【参考方案1】:

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

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

$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);

为菜单中的每个项目递归调用该函数,并检查该项目是否有任何子项。如果是,它会打印出相关的&lt;li/&gt; 条目并再次调用自身以打印出 那个 项的子项。

【讨论】:

嘿伙计,太棒了。效果很好。非常感谢您花时间制作和分享该代码。我想知道是否有一种简单的方法可以使脚本足够通用,以便它可以处理多个列表(因此使用数据库中的 dd_id 作为列表标识符)?再一次,非常感谢蒂姆 @Tim - 没问题。至于使其通用,如何将初始位(构建 $items 数组)放在一个接受 $id 参数的函数中,然后只需修改 SQL 查询以选择 where dd_id = $id? 嘿,克里斯,我和我的朋友一直在努力解决这个问题,但我想我最终弄糊涂了。您能否(如果您有时间)发布一个示例,说明如何根据数据库中的 dd_id 字段生成列表?

以上是关于使用 PHP + CodeIgniter 从 MySQL 数据库生成无序列表的主要内容,如果未能解决你的问题,请参考以下文章

找不到codeigniter MY_Controller

使用 PHP/CodeIgniter 在 MySQL 中获取最后执行的查询

Codeigniter MY_loader 未加载

CodeIgniter 分页 url 页码

CodeIgniter 2:如何多次扩展 CI_Controller?

使用 Codeigniter 插入忽略