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.


Este tema le ha gustado a 1 personas