Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/04/2011, 14:06
Avatar de Danielfuzz
Danielfuzz
 
Fecha de Ingreso: septiembre-2007
Mensajes: 111
Antigüedad: 16 años, 6 meses
Puntos: 18
Pregunta Problema con definicion de una clase

Holas!!

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:
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--;
	}
}
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).
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:
Fatal error: Nesting level too deep - recursive dependency? in C:\AppServ\www\Nodo.php on line 38
La línea 38 es en la que invoco a la funcion array_search


el script en el que pruebo mi clase:

Código:
	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";
Si les sirve de algo el error no sucede cuando el nodo a retirar no posee nodos hijos.

ahora no sé si la mejor solución sería cambiar la manera en la que hago la removida de mi nodo hijo.

Saludos.