Ver Mensaje Individual
  #3 (permalink)  
Antiguo 27/08/2013, 10:08
Nisrokh
 
Fecha de Ingreso: septiembre-2009
Ubicación: Neuquén
Mensajes: 142
Antigüedad: 14 años, 7 meses
Puntos: 12
Respuesta: [APORTE] Estructura de árbol desde de base de datos

Ahora les muestro la versión orientada a objetos, que básicamente hace lo mismo, sólo que de manera diferente.

En vez de un array, el resultado será una instanca de la clase Diba\GenericTree\TableTree, que extiende la clase Diba\GenericTree\Node, y por ende, implementa a la interface Diba\Tree\Node. Y los hijos son contenidos por una instancia de la clase que implementa a Diba\Tree\NodeList.

Al crear una instancia de Diba\GenericTree\TableTree, opcionalmente se puede pasar una instancia de Diba\GenericTree\TableTreeOptions, por si queremos cambiar los 2 valores de entrada necesarios (clave del id y clave del parent_id) y el comparador para ordenar los nodos.

A continuación, las 2 interfaces:

Diba\Tree\Node
Código PHP:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * @author Diego P. M. Baltar <[email protected]>
  5.  * @copyright (c) 2013
  6.  * @package Diba
  7.  * @subpackage Tree
  8.  */
  9. namespace Diba\Tree;
  10.  
  11. /**
  12.  * Define los requisitos para un nodo.
  13.  */
  14. interface Node
  15. {
  16.     /**
  17.      * Devuelve una colección de los nodos hijos.
  18.      *
  19.      * @return \Diba\Tree\NodeList
  20.      */
  21.     public function getChildren();
  22.    
  23.     /**
  24.      * Devuelve el nodo padre (si existe), o de lo contrario null.
  25.      *
  26.      * @return \Diba\Tree\Node|null
  27.      */
  28.     public function getParent();
  29.    
  30.     /**
  31.      * Devuelve el valor del nodo.
  32.      *
  33.      * @return mixed
  34.      */
  35.     public function getValue();
  36.    
  37.     /**
  38.      * Indica si el nodo contiene hijos.
  39.      *
  40.      * @return bool
  41.      */
  42.     public function hasChildren();
  43.    
  44.     /**
  45.      * Indica si el nodo contiene padre.
  46.      *
  47.      * @return bool
  48.      */
  49.     public function hasParent();
  50. }

Diba\Tree\NodeList
Código PHP:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * @author Diego P. M. Baltar <[email protected]>
  5.  * @copyright (c) 2013
  6.  * @package Diba
  7.  * @subpackage Tree
  8.  */
  9. namespace Diba\Tree;
  10.  
  11. use ArrayAccess;
  12. use Countable;
  13. use IteratorAggregate;
  14.  
  15. /**
  16.  * Define los requisitos para una colección de nodos.
  17.  */
  18. interface NodeList extends ArrayAccess, Countable, IteratorAggregate
  19. {
  20.     /**
  21.      * Agrega un nodo a la colección.
  22.      *
  23.      * @param \Diba\Tree\Node $node El nodo que será agregado.
  24.      * @return void
  25.      */
  26.     public function add(Node $node);
  27.    
  28.     /**
  29.      * Limpia la colección de nodos.
  30.      *
  31.      * @return void
  32.      */
  33.     public function clear();
  34.    
  35.     /**
  36.      * Indica si la colección contiene el nodo especificado.
  37.      *
  38.      * @param \Diba\Tree\Node $node El nodo a buscar.
  39.      * @return bool
  40.      */
  41.     public function contains(Node $node);
  42.    
  43.     /**
  44.      * Indica si la colección de nodos está vacía.
  45.      *
  46.      * @return bool
  47.      */
  48.     public function isEmpty();
  49.    
  50.     /**
  51.      * Quita el nodo especificado de la colección.
  52.      *
  53.      * @param \Diba\Tree\Node $node El nodo a quitar.
  54.      * @return void
  55.      */
  56.     public function remove(Node $node);
  57.    
  58.     /**
  59.      * Devuelve una copia de la colección, como array.
  60.      *
  61.      * @return array
  62.      */
  63.     public function toArray();
  64. }

(Continúa en comentarios)
__________________
Amigos de Foros del Web: seamos más solidarios. ¡No dejemos que un tema se valla al final de las páginas con 0 (cero) respuestas! ¡Gracias por su ayuda! :-)