Display tree structure in ul li tag from preorder crawl table

Based on: Getting a modified pre-order tree traversal model (nested set) in <ul>

I have the following table:

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 

And the following query / code for fetching nested records:

  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; } 

Here's the PHP code to display it on the watch page:

 $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); } } 

But its display does not display correctly:

It displays the output as:

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

The desired result is as follows:

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

Is there any solution?

+4
source share
1 answer

This should work:

 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']; } } 

But with this function you will not print depth.

Tested and works with

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

All Articles