tengo un problema con un metodo para clase que he creado, esta clase se llama Nodo y consiste basicamente en que puede anidar o contener varios otros Nodos en su interior y asi sucesivamente (como árbol), para ello mi clase nodo tiene un miembro que es un arreglo en el que almacenará a todos su inmediatos nodos hijos.
Además mi clase tiene respectivamente metodos para anadir nodos y removerlos. Mas o menos mi clase quedaría así:
Código:
En fin, aca el método conflictivo es el de removeElemento al que se le pasa como parámetro otro objeto de la misma clase (Nodo).class Nodo { public $nombre; public $valor; public $atributos=array(); public $elementos=array(); private $contador=0; public $padre=null; function __construct($nombre, $valor="") { $this->nombre=$nombre; $this->valor=$valor; $this->padre=$padre; } public function addAtributo($nombre,$valor) { $this->atributos[$nombre]=$valor; } public function removeAtributo($nombre) { unset($this->atributos[$nombre]); } public function addElemento($nodo) { $nodo->padre=$this; $this->elementos[$this->contador]=$nodo; $this->contador++; } public function removeElemento($nodo) { $llave=array_search($nodo, $this->elementos); $this->elementos[$llave]->padre=null; while(isset($this->elementos[$llave+1])) { $this->elementos[$llave]=$this->elementos[$llave+1]; $llave++; } unset($this->elementos[$llave]); $this->contador--; } }
Dentro del método removeElemento hago uso de la función array_search que me devuelve la llave o índice de posición del elemento que le pasas como parámetro. Entonces teniendo ya el indice/llave puedo recolocar los otros elementos existentes sobreescribiendo la posicion del elemento que retiré para finalmente hacer unset a la ultima posicion del arrelgo (ya que el ultimo paso a ser penultimo).
Pero cuando pruebo mi clase mediante el siguiente script me da este error:
Cita:
La línea 38 es en la que invoco a la funcion array_searchFatal error: Nesting level too deep - recursive dependency? in C:\AppServ\www\Nodo.php on line 38
el script en el que pruebo mi clase:
Código:
Si les sirve de algo el error no sucede cuando el nodo a retirar no posee nodos hijos.include_once("Nodo.php"); $nodo = new Nodo("raiz"); $nodo->addAtributo("paginas",1); $nodo->addElemento(new Nodo("hijo")); \\si comento esto y las siguientes 3 líneas no se lanza ningún error $nodo->elementos[0]->addAtributo("id",1); $nodo->elementos[0]->addElemento(new Nodo("nombre")); $nodo->elementos[0]->elementos[0]->valor="Daniel"; echo "<br>nodo raíz tiene ".count($nodo->elementos)." elementos"; $aux=$nodo->elementos[0]; $nodo->removeElemento($aux); echo "<br>nodo raíz tiene ".count($nodo->elementos)." elementos";
ahora no sé si la mejor solución sería cambiar la manera en la que hago la removida de mi nodo hijo.
Saludos.