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?

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top