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