2010-05-24 113 views
2

我正尝试使用PHP以下列格式构建动态生成的无序列表。我使用CodeIgniter,但它可以只是普通的PHP。从MySQL数据库中使用PHP + CodeIgniter生成无序列表

这是我需要达到的最终输出。

<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循环来生成第一级类别。

我不知道如何在每个循环内迭代并检查父母,并以动态的方式做到这一点,以便可以有一个无尽的儿童树。

感谢您提供任何帮助。

回答

4

如果您输出类别,然后我可能会做的两个步骤:

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

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

函数被递归调用在菜单的每个项目,并检查,看看是否能项目有任何孩子。如果确实如此,则打印出相关的<li/>条目并再次打电话给自己打印出的那个项。

+0

嘿,伙计, 太棒了。效果很好。非常感谢您花时间制作和分享这些代码。我想知道是否有一种简单的方法来使脚本具有足够的通用性,以便它可以处理多个列表(因此在数据库中使用dd_id作为列表标识符)? 再次,谢谢你这么多 Tim – Tim 2010-05-25 04:41:30

+0

@Tim - 没问题。至于使它是通用的,如何将最初的位(构建$ items数组)放在一个需要$ id参数的函数中,然后修改SQL查询以选择dd_id = $ id? – Chris 2010-05-25 06:45:17

+0

嘿克里斯, 我和我的朋友一直在努力解决这个问题,但我认为我最终会迷惑自己。你可以(如果你有任何时间)发布一个例子,说明如何根据db中的dd_id字段生成列表? – Tim 2010-05-27 11:36:46