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<?php
/**
* @copyright (c) 2013
* @package Diba
* @subpackage Tree
*/
namespace Diba\Tree;
/**
* Define los requisitos para un nodo.
*/
interface Node
{
/**
* Devuelve una colección de los nodos hijos.
*
* @return \Diba\Tree\NodeList
*/
public function getChildren();
/**
* Devuelve el nodo padre (si existe), o de lo contrario null.
*
* @return \Diba\Tree\Node|null
*/
public function getParent();
/**
* Devuelve el valor del nodo.
*
* @return mixed
*/
public function getValue();
/**
* Indica si el nodo contiene hijos.
*
* @return bool
*/
public function hasChildren();
/**
* Indica si el nodo contiene padre.
*
* @return bool
*/
public function hasParent();
}
Diba\Tree\NodeList
Código PHP:
Ver original<?php
/**
* @copyright (c) 2013
* @package Diba
* @subpackage Tree
*/
namespace Diba\Tree;
use ArrayAccess;
use Countable;
use IteratorAggregate;
/**
* Define los requisitos para una colección de nodos.
*/
interface NodeList extends ArrayAccess, Countable, IteratorAggregate
{
/**
* Agrega un nodo a la colección.
*
* @param \Diba\Tree\Node $node El nodo que será agregado.
* @return void
*/
public function add(Node $node);
/**
* Limpia la colección de nodos.
*
* @return void
*/
public function clear();
/**
* Indica si la colección contiene el nodo especificado.
*
* @param \Diba\Tree\Node $node El nodo a buscar.
* @return bool
*/
public function contains(Node $node);
/**
* Indica si la colección de nodos está vacía.
*
* @return bool
*/
public function isEmpty();
/**
* Quita el nodo especificado de la colección.
*
* @param \Diba\Tree\Node $node El nodo a quitar.
* @return void
*/
public function remove(Node $node);
/**
* Devuelve una copia de la colección, como array.
*
* @return array
*/
public function toArray();
}
(Continúa en comentarios)