Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/10/2011, 17:28
loluchis
 
Fecha de Ingreso: octubre-2011
Mensajes: 37
Antigüedad: 12 años, 6 meses
Puntos: 9
unset heredando de ArrayIterator

Muy buenas, os traigo algo realmente raro, o no lo logro entender o es un bug o algo raro, ahi voy:

Código:
<?php

class Coleccion extends ArrayIterator
{
    
    public function clear()
    {
	foreach($this as $key => $value)
	    unset($this[$key]);
    }

}

$c = new Coleccion();
$c[] = 'valor1';
$c[] = 'valor2';
$c[] = 'valor...';

echo '<pre>', print_r($c), '</pre>';

/*
  esto imprime:
   Coleccion Object
   (
    [storage:ArrayIterator:private] => Array
        (
            [0] => valor1
            [1] => valor2
            [2] => valor...
        )

   )
   1
 */

$c->clear();

echo '<pre>', print_r($c), '</pre>';

/*
  esto imprime:
   Coleccion Object
   (
    [storage:ArrayIterator:private] => Array
        (
            [1] => valor2
        )

   )
   1
 */

/*
 * SOLUCION:
 * en el metodo clear(), contar elemetos, si aun hay, volver a limpiar
 * 
    public function clear()
    {
	foreach($this as $key => $value)
	    unset($this[$key]);
	if($this->count())
	    $this->clear();
    }
 
 */
es decir, clear no unsetea todos los elementos, sin embargo pasa por los indices, pero por alguna razon el indice 1, no lo unsetea, sabeis por que?, queda muy sucio volver a preguntar si aun hay elementos a count para volver a ejecutar la misma funcion....

PD: aclaro que heredo de ArrayIterator y no de ArrayObject, ya que el primero permite iterarse a si mismo, y el segundo segun he comprobado y leido en php.net itera sobre una copia de si mismo, por lo tanto en este caso concreto, en esta funcion clear, no podria modificar los valores o unsetearlos como es el caso... si podeis aclarar esto magnifico

saludos amigos y muchas gracias