使用PHP进行递归树遍历 - 布局问题

时间:2012-06-13 01:55:44

标签: php html arrays recursion

我正在为客户创建一份调查问卷,要求问题按3层次组织,问题和类别数量不明。我成功创造了U.I.以及从数据库中提取信息的代码,但我一直在试图找出如何将所有内容加载到正确的位置。数据库由客户端组织,所以我无法控制它:

id    description    parentId    
1      Level 1        0           
2      Level 2        0           
3      Level 1a       1   
4      Level 1b       1 
5      Level 1a1      3   

我现在使用的代码是:

function printChildQuestions($parentid) {
  $sql="SELECT * FROM pB_test WHERE parentID=$parentid";
  $result=mysql_query($sql);
  $i=0;
  while (true) {
    $row=mysql_fetch_array($result);
    if (!$row) break;
    if ($row['parentId'] == 0) {
        echo '<div class="tabs">';
        echo '<span class="level1">'.$row['description'].'</span>';
        echo '<ul id="main-nav"><h2 align="center">Categories</h2></ul>';
        echo '<div>'.$row['id'].'&nbsp;'.$row['description'].'&nbsp;'.$row['parentId'].'</div>';
        if ($row['parentId'] == 1) {
        }
        echo '</div>';
    } else {
    echo '<div>'.$row['id'].'&nbsp;'.$row['description'].'&nbsp;'.$row['parentId'].'</div>';
    }
    printChildQuestions($row['id']);
  }
}

printChildQuestions(0);

并且需要生成的html位于:http://jsfiddle.net/Cyb2N/

问题在于我提出的每个想法都需要我对级别进行硬编码并在引入级别2时中断。有人能把我推向正确的方向吗?谢谢!

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您是否正在寻找一种方法来解决客户数据中parentId引用所隐含的级别?像这样:

Level 1           
   Level 1a          
      Level 1a1         
   Level 1b        
Level 2        

如何使用引用父级别的Level属性创建parent类?然后,您可以遍历客户端的数据,将Level实例解析为一棵漂亮的树,并从那里做任何你想做的事。

或者,您可以为Level类提供一个children属性,该属性是将该实例作为父级引用的级别的集合...无论如何,重点是您可以转换客户端的平面数据变成了一个有用的树模型,具有相当简单的类。通过计算父母(或孩子),你可以知道给定等级的树上/下有多远。

答案 1 :(得分:0)

printChildQuestions是一个递归函数。听起来你不知道如何确定你所处的递归级别。方法如下:

printChildQuestions($parent_id);

function printChildQuestions($parent_id, $level = 1){
    if( $need_to_recurse ){
        printChildQuestions($new_parent, $level + 1);
    }
}