我有一个类别表,如下所示:
---------------------------------------- | id | parentId | Name | ---------------------------------------- 1 0 Cat 1 2 0 Cat 2 3 0 Cat 3 4 2 Cat 4 5 3 Cat 5 6 5 Cat 6
基本上我需要遍历这些类别,创建一个UL LI html列表,如下所示:
<ul id="categories">
<li id="1">Cat 1</li>
<li id="2">Cat 2
<ul>
<li id="4">Cat 4</li>
</ul>
</li>
<li id="3">Cat 3
<ul>
<li id="5">Cat 5
<ul>
<li id="6">Cat 6</li>
</ul>
</li>
</ul>
</li>
</ul>
我有重大问题试图迭代这个尝试创建上面的HTML。 id可能是parentId中深层次的任意数量级别。我用PHP来解决这个问题。因为有很多级别的深度我认为我需要做一些array_walk funuction而不是如何。另外,为了让它的机器运行得更加困难,它运行PHP4并且我知道它需要升级但是它不能在最后因此我需要一个理想的php 4解决方案。我应该怎么做呢?
答案 0 :(得分:2)
尝试使用左/右树方法将分层信息存储在数据库中。
http://blogs.sitepoint.com/hierarchical-data-database/
这就是我在我的网站上所做的,我有多级LI需要以1:6打开,并且孩子2:3,4:5,其中第一个数字是'left',第二个是正确的'。我现在有大约5个级别,但你可以有更多。这只是开发一个界面,用于根据您添加的位置设置正确的左/右值。
您只需在表格中添加“lft”和“rgt”列(如该文章中所述)。
答案 1 :(得分:0)
首先创建一个树结构,然后使用id和parent_id将您的类别插入到树中。然后使用要处理的数组的引用列表或递归来尝试Depth-first_search。
function printRecList($tree){
// exit condition
if (is_string($tree))
echo "<li>$tree</li>";
echo "<ul>";
foreach ($tree as $subtree)
printRecList($subtree); // recursion step
echo "</ul>";
}
答案 2 :(得分:0)
数据库的结构方式,你不能用一个mysql查询来做,你应该递归地做。符合以下内容:
function print_children ($id) {
$children = query("SELECT * FROM `table` WHERE `parentId` = " . (int)$id);
if (!empty($children)) {
echo '<ul>';
foreach ($children as $child) {
echo '<li>' . $child['name'];
print_children($child['id']);
echo '</li>';
}
echo '</ul>';
}
}
print_children(0);
将查询替换为获取数据库查询结果的内容。
答案 3 :(得分:0)
function writelevel($id, $txt, $children) {
if (isset($txt[$id]))
echo "<li id=\"$id\">".$txt[$id];
if (isset($children[$id])) {
echo "<ul>";
foreach ($children[$id] as $child)
writelevel($child, $txt, $children);
echo "</ul>";
}
if (isset($txt[$id]))
echo "</li>";
}
//Assuming your query is done and the result is in $qry
$txt=array();
$children=array();
//Fetch and structure data
while (true) {
//Fetch next row
$row=mysql_fetch_row($qry);
if (!$row) break;
//Store text
$txt[$row[0]]=$row[2];
//Store child relationships
if (!isset($children[$row[1]])) $children[$row[1]]=array();
$children[$row[1]]=$row[0];
}
//Writeout
writelevel(0);