2012-08-01 36 views
4

序遍歷表顯示樹狀結構中的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

回答

3

這應該工作:

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