Foros del Web » Programando para Internet » PHP »

Arbol de categorias a tabla html

Estas en el tema de Arbol de categorias a tabla html en el foro de PHP en Foros del Web. Buenas a todos. Recurro a pedir ayuda por internet ya que llevo unos días atrancado en un problema y no consigo dar con la tecla. ...
  #1 (permalink)  
Antiguo 31/08/2014, 23:00
 
Fecha de Ingreso: noviembre-2010
Mensajes: 5
Antigüedad: 13 años, 5 meses
Puntos: 0
Arbol de categorias a tabla html

Buenas a todos.
Recurro a pedir ayuda por internet ya que llevo unos días atrancado en un problema y no consigo dar con la tecla.
Como indico en el título, estoy intentando crear una tabla a partir de un arbol de categorías, pero a la hora de hacer el algoritmo que construya la tabla no doy con la solución.
Código PHP:
Ver original
  1. /*
  2.          * Construye el array de categorias en forma de arbol
  3.          * */
  4.         $raw = $DB->get_records('question_categories', array('parent' => 0, 'contextid' => $this->context->id),'sortorder ASC');
  5.        
  6.        
  7.        
  8.         foreach ($raw as $i){
  9.            $this->categoriasArbol[$i->id]=array(
  10.                 'id'=>$i->id,
  11.                 'nombre'=>$i->name,
  12.                 'parent'=>$i->parent,
  13.                 'nsubcat'=> $DB->count_records('question_categories', array('parent' => $i->id, 'contextid' => $this->context->id)),
  14.                 'subcat' =>array());
  15.             if ($this->categoriasArbol[$i->id]['nsubcat']>0) {
  16.                 $this->categoriasArbol[$i->id]['subcat'] = $this->lee_subcategorias($i->id);
  17.             }
  18.         }
Código PHP:
Ver original
  1. private function lee_subcategorias($id) {
  2.         global $DB;
  3.         $temp = array();
  4.        
  5.         $raw = $DB->get_records('question_categories', array('parent' => $id, 'contextid' => $this->context->id), 'sortorder ASC');
  6.        
  7.         foreach ($raw as $i){
  8.             $temp[$i->id]=array(
  9.                 'id'=>$i->id,
  10.                 'nombre'=>$i->name,
  11.                 'parent'=>$i->parent,
  12.                 'nsubcat'=> $DB->count_records('question_categories', array('parent' => $i->id, 'contextid' => $this->context->id)),
  13.                 'subcat' =>array());
  14.             if ($temp[$i->id]['nsubcat']>0) {
  15.                 $temp[$i->id]['subcat'] = $this->lee_subcategorias($i->id);
  16.             }
  17.         }
  18.         return $temp;

Con esto construyo el arbol de categorías.

Lo siguiente es crear las celdas, empezando por el padre y recorriendo todos los hijos.
Código PHP:
Ver original
  1. private function creaCeldasCategorias($cat) {
  2.        
  3.         $celda = new html_table_cell();
  4.         $celda->idcat = $cat['id'];
  5.         $celda->parent = $cat['parent'];
  6.         $celda->rowspan = $this->calculaRowspan($cat);
  7.         $celda->text = $cat['nombre'];
  8.         $celda->nsubcat = $cat['nsubcat'];
  9.        
  10.         if ($cat['nsubcat']>0) {
  11.             $celda->subcat = array();
  12.             foreach ($cat['subcat'] as $c) {
  13.                 $celda->subcat[] = $this->creaCeldasCategorias($c);
  14.             }
  15.            
  16.         }
  17.         return $celda;
  18.     }
  19.  
  20. private function calculaRowspan($cat) {
  21.         $n=0;
  22.         if ($cat['nsubcat']==0) {
  23.             return 1;
  24.         }
  25.         else {
  26.             foreach ($cat['subcat'] as $c) {
  27.                 $n += $this->calculaRowspan($c);
  28.             }
  29.         }
  30.         return $n;
  31.     }
  32.  
  33. $celdasCat = $this->creaCeldasCategorias($this->categoriasArbol[126]);

Con esto tengo ya un array de objetos html_table_cell. Lo siguiente es donde tengo el problema, y es a la hora de recorrer el arbol y meter cada celda en la fila que le corresponda.

Un ejemplo de una rama de categorias seria esto
Código HTML:
Ver original
  1. <table border=1>
  2.     <tr>
  3.         <td rowspan=20>Categoria 1</td>
  4.         <td rowspan=10>Categoria 1-1</td>
  5.         <td rowspan=2>Categoria 1-1-1</td>
  6.         <td rowspan=1>Categoria 1-1-1-1</td>
  7.     </tr>
  8.     <tr>
  9.         <td rowspan=1>Categoria 1-1-1-2</td>
  10.     </tr>
  11.     <tr>
  12.         <td rowspan=1>Categoria 1-1-2</td>
  13.     </tr>
  14.     <tr>
  15.         <td rowspan=1>Categoria 1-1-3</td>
  16.     </tr>
  17.     <tr>
  18.         <td rowspan=1>Categoria 1-1-4</td>
  19.     </tr>
  20.     <tr>
  21.         <td rowspan="5">Categoria 1-1-5</td>
  22.         <td rowspan=1>Categoria 1-1-5-1</td>
  23.     </tr>
  24.     <tr>
  25.         <td rowspan=1>Categoria 1-1-5-2</td>
  26.     </tr>
  27.     <tr>
  28.         <td rowspan="3">Categoria 1-1-5-3</td>
  29.         <td rowspan=1>Categoria 1-1-5-3-1</td>
  30.     </tr>
  31.     <tr>
  32.         <td rowspan=1>Categoria 1-1-5-3-2</td>
  33.     </tr>
  34.     <tr>
  35.         <td rowspan=1>Categoria 1-1-5-3-3</td>
  36.     </tr>
  37.     <tr>
  38.         <td rowspan="3">Categoria 1-2</td>
  39.         <td rowspan=1>Categoria 1-2-1</td>
  40.     </tr>
  41.     <tr>
  42.         <td rowspan=1>Categoria 1-2-2</td>
  43.     </tr>
  44.     <tr>
  45.         <td rowspan=1>Categoria 1-2-3</td>
  46.     </tr>
  47.     <tr>
  48.         <td rowspan="2">Categoria 1-3</td>
  49.         <td rowspan=1>Categoria 1-3-1</td>
  50.     </tr>
  51.     <tr>
  52.         <td rowspan=1>Categoria 1-3-2</td>
  53.     </tr>
  54.     <tr>
  55.         <td rowspan="2">Categoria 1-4</td>
  56.         <td rowspan=1>Categoria 1-4-1</td>
  57.     </tr>
  58.     <tr>
  59.         <td rowspan=1>Categoria 1-4-2</td>
  60.     </tr>

Llevo dándole vueltas y par de días, he intentado hacerlo tanto recursivo como iterativo pero no lo consigo. A ver si alguien puede echarme un cable.
Gracias.
  #2 (permalink)  
Antiguo 01/09/2014, 21:44
 
Fecha de Ingreso: noviembre-2010
Mensajes: 5
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Arbol de categorias a tabla html

Up
+10 caracteres

Etiquetas: categorias, html, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:07.