显示树状结构中的UL L1标签从没有工作

问题描述:

序遍历表显示树状结构中的UL L1标签从没有工作

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 

有没有什么解决办法吗?

+0

你能提供一个'var_export(工作)'所得到的'$ tree'阵列的? – 2012-08-03 09:30:36

这应该工作:

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); 
+0

我试过但没有工作 – Sky 2012-08-03 09:44:09

+0

错误在哪里? – Jerska 2012-08-03 09:47:22

+0

没有错误显示,但它不会去,如果阻止多数民众赞成为什么不显示输出 – Sky 2012-08-03 09:48:47