Itération sur un tableau de membres avec IteratorAggregate
Question
J'ai une classe et je veux pouvoir parcourir un certain membre du tableau. J'ai effectué une recherche rapide et trouvé IteratorAggregate
:
class foo implements IteratorAggregate
{
protected J'ai une classe et je veux pouvoir parcourir un certain membre du tableau. J'ai effectué une recherche rapide et trouvé IteratorAggregate
:
protected J'ai une classe et je veux pouvoir parcourir un certain membre du tableau. J'ai effectué une recherche rapide et trouvé IteratorAggregate
:
class foo implements IteratorAggregate
{
protected J'ai une classe et je veux pouvoir parcourir un certain membre du tableau. J'ai effectué une recherche rapide et trouvé IteratorAggregate
:
<*>
qui fonctionne très bien, mais ne crée-t-il pas une nouvelle instance ArrayIterator
chaque fois que foreach
est utilisé dessus?
J'ai donc pensé que je devrais stocker l'instance d'itérateur dans un membre:
<*>
Le problème est que l'itérateur utilise une copie de $ this- > _array
lors du premier appel de getIterator ()
, de sorte que les modifications apportées au membre ne sont pas réfléchi sur les constructions foreach
suivantes.
Je pensais que je devrais sous-classer ArrayIterator
, ajouter une méthode setArray ($ array)
et l'appeler avant de le renvoyer dans getIterator ()
, mais je ne connais pas le nom de membre du tableau qu’il utilise en interne et s’il est écrasable par une sous-classe.
La question est la suivante: s’agit-il d’une optimisation prématurée et / ou inutile? Si non, quel est le meilleur moyen d'y parvenir?
array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
qui fonctionne très bien, mais ne crée-t-il pas une nouvelle instance ArrayIterator
chaque fois que foreach
est utilisé dessus?
J'ai donc pensé que je devrais stocker l'instance d'itérateur dans un membre:
<*>
Le problème est que l'itérateur utilise une copie de $ this- > _array
lors du premier appel de getIterator ()
, de sorte que les modifications apportées au membre ne sont pas réfléchi sur les constructions foreach
suivantes.
Je pensais que je devrais sous-classer ArrayIterator
, ajouter une méthode setArray ($ array)
et l'appeler avant de le renvoyer dans getIterator ()
, mais je ne connais pas le nom de membre du tableau qu’il utilise en interne et s’il est écrasable par une sous-classe.
La question est la suivante: s’agit-il d’une optimisation prématurée et / ou inutile? Si non, quel est le meilleur moyen d'y parvenir?
iterator;
public function getIterator()
{
if (!$this->_iterator instanceof ArrayIterator) {
$this->_iterator = new ArrayIterator($this->_array);
}
return $this->_iterator;
}
qui fonctionne très bien, mais ne crée-t-il pas une nouvelle instance ArrayIterator
chaque fois que foreach
est utilisé dessus?
J'ai donc pensé que je devrais stocker l'instance d'itérateur dans un membre:
<*>
Le problème est que l'itérateur utilise une copie de $ this- > _array
lors du premier appel de getIterator ()
, de sorte que les modifications apportées au membre ne sont pas réfléchi sur les constructions foreach
suivantes.
Je pensais que je devrais sous-classer ArrayIterator
, ajouter une méthode setArray ($ array)
et l'appeler avant de le renvoyer dans getIterator ()
, mais je ne connais pas le nom de membre du tableau qu’il utilise en interne et s’il est écrasable par une sous-classe.
La question est la suivante: s’agit-il d’une optimisation prématurée et / ou inutile? Si non, quel est le meilleur moyen d'y parvenir?
array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
qui fonctionne très bien, mais ne crée-t-il pas une nouvelle instance ArrayIterator
chaque fois que foreach
est utilisé dessus?
J'ai donc pensé que je devrais stocker l'instance d'itérateur dans un membre:
<*> Le problème est que l'itérateur utilise une copie de $ this- > _array
lors du premier appel de getIterator ()
, de sorte que les modifications apportées au membre ne sont pas réfléchi sur les constructions foreach
suivantes.
Je pensais que je devrais sous-classer ArrayIterator
, ajouter une méthode setArray ($ array)
et l'appeler avant de le renvoyer dans getIterator ()
, mais je ne connais pas le nom de membre du tableau qu’il utilise en interne et s’il est écrasable par une sous-classe.
La question est la suivante: s’agit-il d’une optimisation prématurée et / ou inutile? Si non, quel est le meilleur moyen d'y parvenir?
La solution
Votre second code échouera sur plusieurs boucles de l'objet où vous commencerez une nouvelle boucle avant qu'une autre ne soit terminée.
Cela ne ressemblait pas vraiment à une optimisation qui vaut la peine de passer du temps sur l'un ou l'autre.
Autres conseils
mais cela ne crée-t-il pas une nouvelle instance ArrayIterator chaque fois que foreach est utilisé dessus?
oui et?