【问题标题】:Build category - sub category html list from mysql table从 mysql 表中构建类别 - 子类别 html 列表
【发布时间】:2010-06-29 13:35:32
【问题描述】:

我有一个带有 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

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

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

非常感谢。

【问题讨论】:

标签: php mysql tree recursion


【解决方案1】:

我使用“Modified Preorder Tree Traversal”,也称为“Nested Sets”。 This Sitepoint article 很好地总结了它的工作原理。 Hector Virgen 写了一个 Zend_Db_Table enhancement 来支持我正在使用的它,因为我的应用程序是基于 Zend 框架构建的。我还使用the code written by Nick Pack 在 PHP 中构建树。

【讨论】:

  • 我确实更喜欢将其作为解决方案,但它确实需要更改架构,所以我认为递归可能是 OP 坚持其架构的最佳选择
【解决方案2】:
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 等设置所需的样式。

【讨论】:

    【解决方案3】:

    您可能将递归函数视为解决此问题的最简单方法。一个非常简单的例子是这样的,你可以使用各种技术来使它成为一个合适的树结构。真的取决于你想做什么 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 上有一些关于管理分层数据的非常好的信息,但最优雅的解决方案意味着您更改架构,我不确定您是否能够做到?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多