构建类别 - 来自mysql表的子类别html列表

时间:2010-06-29 13:35:32

标签: php mysql tree recursion

我有一个包含categoryId,name和parentId的表。我想构建一个包含结构

的父树和子树的html列表

我的表看起来像这样

------------------------------------------------------------------
id  categoryId  parentId  categoryName      SortSeq
------------------------------------------------------------------
1  438044691  NULL        test              1   
2  438044692  438044691   test item one     2   
3  438044693  438044691   test item two     3
1  438044701  NULL        testOne           4    
2  438044702  438044701   testOne item one  5   
3  438044703  438044701   testOne item two  6
1  438044709  NULL        testTwo           7   
2  438044710  438044709   testTwo item one  8   
3  438044711  438044709   testTwo item two  9

结构也可以有子子类别项。但它只是这个例子中的一个。

如果您认为问题不完整,我将非常乐意为您提供更多信息。

非常感谢你。

3 个答案:

答案 0 :(得分:0)

我使用“Modified Preorder Tree Traversal”,也称为“嵌套集”。 This Sitepoint article提供了有关其工作原理的完美摘要。 Hector Virgen已经写了一个Zend_Db_Table enhancement来支持我正在使用它,因为我的应用程序是在Zend Framework上构建的。我还使用the code written by Nick Pack在PHP中构建树。

答案 1 :(得分:0)

function categorylist($parent=NULL, $level = 0) {
    $sql = "SELECT `id`,`name` FROM `categories` WHERE `parentId`";
    if($parent === NULL) {
        $sql .= " IS NULL";
    else {
        $sql .= " = '".$parent."'";
    }
    $sql .= " ORDER BY `SortSeq`";
    $res = mysql_query($sql); 
    while ($cat = mysql_fetch_object($res)) {           
        echo '<li class="level'.$level.'">'.$line['name'].'</li>';
        $new_level = $level + 1;
        categorylist($line['id'], $new_level); 
    }
}

echo '<ul>';
categorylist();
echo '</ul>';

然后,您可以为每个班级level1level2等设置列表的样式。

答案 2 :(得分:-1)

您可能正在将递归函数视为最简单的解决方案。一个非常简单的例子是这样的,你可以使用各种技术使它成为一个合适的树结构。真的取决于你想做什么tbh

function showlist($parent=NULL) {
    $q = ($parent !== NULL) ? "SELECT `id`,`name` FROM `categories` WHERE `parentId` ='".$parent."'" : "SELECT `id`,`name` FROM `categories` WHERE `parentId` IS NULL";
    $result = mysql_query($q)or die(mysql_error()); 
    while ($cat = mysql_fetch_assoc($result)) {             
        echo $line['name'];
        showlist($line['id']); 
    }
}

关于MySQL site关于管理分层数据的一些非常好的信息,但最优雅的解决方案意味着你改变你的Schema,我不确定你是否能够做到?