Partimos de una tabla de adyacencia con la siguiente estructura:
*id
-nombre
-parent_id
añadimos los campos:
-rgt
-lft
para generar el árbol:
function rebuild_tree($parent_id, $left){
//lugar desde el que recalculamos el arbol
$right = $left + 1;
$this->db->select("id");
$query = $this->db->get_where("balance_situacion", array("padre_id"=>$parent_id));
$result = $query->result_array();
foreach ($result as $item){
var_dump($item);
$right = $this->rebuild_tree($item['id'], $right);
}
$this->db->where("id", $parent_id);
$this->db->update("balance_situacion", array("lft"=>$left, "rgt"=> $right));
return $right + 1;
}
para recorrer el arbol (y mostrarlo en pantalla):
function display_tree($root_id){
$qry = $this->db->get_where("balance_situacion", array("id"=>$root_id));
$rst = $qry->row_array();
$right = array();
$this->db->where("lft BETWEEN '". $rst['lft'] ."' AND '". $rst['rgt'] ."'");
$this->db->order_by("lft ASC");
$qry = $this->db->get("balance_situacion");
$rst = $qry->result_array();
foreach($rst as $row){
if(count($right)>0){
while($right[count($right)-1]<$row['rgt']){
array_pop($right);
}
}
if(abs($row['lft']-$row['rgt'])==1){
echo '<span style="color: red">';
}
echo str_repeat(' ', $row['categoria']/*count($right)*/).$row['nombre']. "<br />";
$right[] = $row['rgt'];
if(abs($row['lft']-$row['rgt'])==1){
echo "</span>";
}
}
}
Suscribirse a:
Entradas (Atom)