Iterando sobre una matriz de miembros con IteratorAggregate
Pregunta
Tengo una clase y quiero poder iterar sobre un determinado miembro de la matriz. Hice una búsqueda rápida y encontré IteratorAggregate
:
class foo implements IteratorAggregate
{
protected Tengo una clase y quiero poder iterar sobre un determinado miembro de la matriz. Hice una búsqueda rápida y encontré IteratorAggregate
:
protected Tengo una clase y quiero poder iterar sobre un determinado miembro de la matriz. Hice una búsqueda rápida y encontré IteratorAggregate
:
class foo implements IteratorAggregate
{
protected Tengo una clase y quiero poder iterar sobre un determinado miembro de la matriz. Hice una búsqueda rápida y encontré IteratorAggregate
:
<*>
que funciona muy bien, pero ¿eso no crea una nueva instancia de ArrayIterator
cada vez que se usa foreach
en ella?
Así que pensé que debería almacenar la instancia del iterador en un miembro:
<*>
El problema es que el iterador usa una copia de $ this- > _array
durante la primera llamada de getIterator ()
, por lo que los cambios en el miembro no son reflejado en posteriores construcciones foreach
.
Estaba pensando que debería subclasificar ArrayIterator
, agregar un método setArray ($ array)
y llamarlo antes de devolverlo en getIterator ()
, pero no sé el nombre del miembro de la matriz que usa internamente y si una subclase puede sobrescribirlo o no.
La pregunta es: ¿es una optimización prematura y / o innecesaria? Si no, ¿cuál es la mejor manera de lograr esto?
array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
que funciona muy bien, pero ¿eso no crea una nueva instancia de ArrayIterator
cada vez que se usa foreach
en ella?
Así que pensé que debería almacenar la instancia del iterador en un miembro:
<*>
El problema es que el iterador usa una copia de $ this- > _array
durante la primera llamada de getIterator ()
, por lo que los cambios en el miembro no son reflejado en posteriores construcciones foreach
.
Estaba pensando que debería subclasificar ArrayIterator
, agregar un método setArray ($ array)
y llamarlo antes de devolverlo en getIterator ()
, pero no sé el nombre del miembro de la matriz que usa internamente y si una subclase puede sobrescribirlo o no.
La pregunta es: ¿es una optimización prematura y / o innecesaria? Si no, ¿cuál es la mejor manera de lograr esto?
iterator;
public function getIterator()
{
if (!$this->_iterator instanceof ArrayIterator) {
$this->_iterator = new ArrayIterator($this->_array);
}
return $this->_iterator;
}
que funciona muy bien, pero ¿eso no crea una nueva instancia de ArrayIterator
cada vez que se usa foreach
en ella?
Así que pensé que debería almacenar la instancia del iterador en un miembro:
<*>
El problema es que el iterador usa una copia de $ this- > _array
durante la primera llamada de getIterator ()
, por lo que los cambios en el miembro no son reflejado en posteriores construcciones foreach
.
Estaba pensando que debería subclasificar ArrayIterator
, agregar un método setArray ($ array)
y llamarlo antes de devolverlo en getIterator ()
, pero no sé el nombre del miembro de la matriz que usa internamente y si una subclase puede sobrescribirlo o no.
La pregunta es: ¿es una optimización prematura y / o innecesaria? Si no, ¿cuál es la mejor manera de lograr esto?
array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
que funciona muy bien, pero ¿eso no crea una nueva instancia de ArrayIterator
cada vez que se usa foreach
en ella?
Así que pensé que debería almacenar la instancia del iterador en un miembro:
<*> El problema es que el iterador usa una copia de $ this- > _array
durante la primera llamada de getIterator ()
, por lo que los cambios en el miembro no son reflejado en posteriores construcciones foreach
.
Estaba pensando que debería subclasificar ArrayIterator
, agregar un método setArray ($ array)
y llamarlo antes de devolverlo en getIterator ()
, pero no sé el nombre del miembro de la matriz que usa internamente y si una subclase puede sobrescribirlo o no.
La pregunta es: ¿es una optimización prematura y / o innecesaria? Si no, ¿cuál es la mejor manera de lograr esto?
Solución
Tu segundo código fallará en múltiples bucles del objeto donde comienzas un nuevo bucle antes de que termine otro.
Realmente no parecía una optimización que valiera la pena perder tiempo tampoco.
Otros consejos
pero ¿eso no crea una nueva instancia de ArrayIterator cada vez que se usa foreach en ella?
sí, y?