修改的预订树遍历 - 包含在div中

时间:2012-03-29 18:31:17

标签: php mysql modified-preorder-tree-t

-EDIT- <li>可能会更好,但同样的问题仍然适用。

因此,只要能显示数据并获得预期结果,我就能完成所有工作。我的显示部分来自http://www.sitepoint.com/hierarchical-data-database-2/

的文章

我有:

$right = array();
    $show = "";
    while ($row = mysql_fetch_array($title)) {          
        if (count($right)>0) {
            while (count($right)>0&&($right[count($right)-1]<$row['rgt'])) {
                array_pop($right);
            } 
        }

        $show .= str_repeat('->',count($right)).$row['title'].count($right)."<br>";  
        $right[] = $row['rgt'];
    }
    return $show;

它按预期工作。我现在要做的是将它们正确地包含在div中。所以我希望它看起来像:

<div>
  Title
  <div>
    subtitle
      <div>
        subsubtitle
      </div>
    </div>
</div>
<div>
  Title2
  <div>
    subtitle2
      <div>
        subsubtitle2
      </div>
    </div>
</div>

所以你可以看到顶部的标题div包含该div的所有子节点,依此类推。我不知道该如何解决这个问题。我可以看到我想要做的是,一旦count($right)再次等于div的计数是何时关闭div,但是再次,不知道如何去做。

1 个答案:

答案 0 :(得分:1)

一种方法是将数据组织成一个可以更容易迭代的结构:

$divs = array();
while ($row = mysql_fetch_array($title)) {          
    $divs[$row['left']] = array('type'=>'open', 'text'=>$row['title']);
    $divs[$row['rgt']]  = array('type'=>'close');
}

$divCount = count($divs);
for ($d=1; $d<$divCount; $d++) {
    if ($divs[$d]['type'] == 'open') {
        echo "<div>" . $divs[$d]['text'];
    } else {
        echo "</div>";
    }
}