【问题标题】:Display tree structure in ul li tag from preorder traversal table not working在前序遍历表的 ul li 标签中显示树结构不起作用
【发布时间】:2012-08-01 08:22:58
【问题描述】:

基于:Getting a modified preorder tree traversal model (nested set) into a <ul>

我有下表:

id  name                            lft rgt level
1   company                         1   22  0
75  Developer                       26  31  1
76  Tester                          24  27  1
77  Analyst                         22  23  1
78  under developer                 27  30  2
79  under tster                     25  26  2

以及以下用于获取嵌套记录的查询/代码:

    function getstructureInformation() {
        $treeArr = array();
        $tree = array();
        $sql = "SELECT node.name, node.id, node.unit_id,
               node.description,node.lft,node.rgt,node.level, 
               (COUNT(parent.name) - 1) AS depth
               FROM tablename AS node
               CROSS JOIN tablename AS parent
               WHERE node.lft BETWEEN parent.lft AND parent.rgt
               GROUP BY node.name
               ORDER BY node.lft";

        $query = $this->db->query($sql);
        $data = $query->result();

        foreach ($data as $datap) {
            $treeArr['id'] = $datap->id;
            $treeArr['unit_id'] = $datap->unit_id;
            $treeArr['lft'] = $datap->lft;
            $treeArr['rgt'] = $datap->rgt;
            $treeArr['level'] = $datap->level;
            $treeArr['name'] = $datap->name;
            $treeArr['depth'] = $datap->depth;
            $treeArr['description'] = $datap->description;
            $tree[] = $treeArr;
        }
        return $tree;
    }

这里是用于将其显示到视图页面中的 PHP 代码:

$result = '';
 $currDepth = -1;  // -1 to get the outer <ul>
 while (!empty($tree)) {
  $currNode = array_shift($tree);
  if ($currNode['depth'] > $currDepth) {
    echo '<ul>';
  }
  if ($currNode['depth'] < $currDepth) {       
    $result .= str_repeat('</ul>', $currDepth - $currNode['depth']);
  }
  echo '<li>' . $currNode['name'] . '</li>';
  $currDepth = $currNode['depth'];
  if (empty($tree)) {
    echo str_repeat('</ul>', $currDepth + 1);
  }
}

但它无法正确显示,例如:

它显示输出为:

001 : Company Name

    3 : Analyst      

2 : Tester      

    33 : under tster      
        1 : Developer      
        44 : under developer

想要的输出是这样的:

001 : Company Name

    3 : Analyst  
    2 : Tester  
        33 : under tster  
    1 : Developer  
        44 : under developer

有什么解决办法吗?

【问题讨论】:

  • 你能提供一个var_export() 的结果$tree 数组吗?

标签: mysql codeigniter


【解决方案1】:

这应该可行:

function printTree ($tree) {
    $last_level = -1;

    foreach ($tree as $v) {
        $diff = $v['level'] - $last_level;
        if ($diff == 0)  {
            echo '<li>' .$v['name']. '</li>';
        }
        elseif ($diff > 0) {
            for ($i = 0; $i < $diff; $i++)
                echo '<ul>';
            echo '<li>' .$v['name']. '</li>' ;
        }
        else {
            for ($i = 0; $i > $diff; $i--)
                echo '</ul>';
            echo '<li>' .$v['name']. '</li>' ;
        }
        $last_level = $v['level'];
    }
}

但使用此功能,您将不会打印深度。

经过测试和使用

$tree = array (
    array (
        'name' => 'Line',
        'level' => 0
    ),
    array (
        'name' => 'Line',
        'level' => 1
    ),
    array (
        'name' => 'Line',
        'level' => 2
    ),
    array (
        'name' => 'Line',
        'level' => 1
    )
);
printTree ($tree);

【讨论】:

  • 没有错误显示,但如果阻止这就是为什么不显示输出,它不会出现这种情况
  • 我觉得你的$last_level应该是这样的$last_lvl
  • 是的,我刚刚尝试过,并修复了错误。这个正在工作。 :)
  • 你能说清楚一点吗?当然,如果您是在谈论添加/删除/更新表格中的内容。
  • 删除对此不起作用。当我试图删除父节点时,它会删除该父节点下面的所有节点。它应该只删除特定的父级及其子级。
猜你喜欢
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2012-02-09
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多