通过PHP使用mysql进行递归树遍历

Kei*_*ett 5 php mysql recursion loops traversal

我正在为客户创建一份调查问卷,要求将问题按3层进行组织.我已经成功创建了UI,但是我一直在尝试过去3个小时从数据库中提取数据,以便所有内容都加载到正确的位置.数据库由客户端组织,所以我无法控制它:

id    description    parentId    
1      Level 1        0           
2      Level 2        0           
3      Level 1a       1   
4      Level 1b       1 
5      Level 1a1      3      
Run Code Online (Sandbox Code Playgroud)

我在网站上发现了一个类似的问题但是当我尝试它的解决方案时,我在infinetly上得到以下信息:

码:

function makeList($par_id = 0) {
    //your sql code here
    $result = mysql_query("SELECT * FROM pB_test WHERE parentId = $par_id");
    $pages = mysql_fetch_array( $result );

    if (count($pages)) {
        echo '<ul>';
        foreach ($pages as $page) {
            echo '<li>', $page['description'];
                makeList($page['parentId']);
                echo '</li>';
        }
        echo '</ul>';
    }
}

makeList();
Run Code Online (Sandbox Code Playgroud)

输出:

1
3
5
5
l
l
3
5
5
l
l
3
5
5
l
l
3
5
5
l
l
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个问题,究竟是什么问题?干杯

vla*_*ras 8

每次调用mysql服务器并获取结果都不好

如果你有超过100行怎么办?或200+

使用它只查询一次:

$result = mysql_query("SELECT * FROM test");
$arrs = array();

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $arrs[] = $row;
}

function build_tree($arrs, $parent_id=0, $level=0) {
    foreach ($arrs as $arr) {
        if ($arr['parent_id'] == $parent_id) {
            echo str_repeat("-", $level)." ".$arr['name']."<br />";
            build_tree($arrs, $arr['id'], $level+1);
        }
    }
}

build_tree($arrs);
Run Code Online (Sandbox Code Playgroud)

表的常见示例

  id    name    parent_id
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@vladkras,到目前为止,这是我发现的最佳解决方案 (2认同)

Eug*_*eck 6

这是递归的:

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 ($i==0) echo "<ul>";
    $i=1;
    echo '<li>'.$row['id'].'&nbsp;'.$row['description'].'&nbsp;'.$row['parentId'].'</li>';
    printChildQuestions($row['id']);
  }
  if ($i>0) echo '</ul>';
}

printChildQuestions(0);
Run Code Online (Sandbox Code Playgroud)