Si un itérateur a été partiellement ou complètement traversé, appeler iterator_count () , il renverra le nombre restant d'éléments ou 0.
Exemple d'erreur:
<span><span><span class="hljs-variable">$it</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">ArrayIterator</span></span><span>([</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>]);
</span><span><span class="hljs-variable">$it</span></span><span>-></span><span><span class="hljs-title function_ invoke__">next</span></span><span>(); </span><span><span class="hljs-comment">// Se déplacer une étape</span></span><span>
</span><span><span class="hljs-variable">$count</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iterator_count</span></span><span>(</span><span><span class="hljs-variable">$it</span></span><span>); </span><span><span class="hljs-comment">// retour 3 Plutôt 4</span></span><span>
</span></span>
Solution:
Avant d'appeler iterator_count () , réinitialisez l'itérateur:
<span><span><span class="hljs-variable">$it</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">ArrayIterator</span></span><span>([</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>]);
</span><span><span class="hljs-variable">$it</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rewind</span></span><span>(); </span><span><span class="hljs-comment">// Réinitialiser le pointeur</span></span><span>
</span><span><span class="hljs-variable">$count</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iterator_count</span></span><span>(</span><span><span class="hljs-variable">$it</span></span><span>); </span><span><span class="hljs-comment">// retour 4</span></span><span>
</span></span>
iterator_count () traversera complètement l'itérateur. Si l'ensemble de données est énorme ou que l'itérateur contient une logique complexe, elle peut entraîner de graves problèmes de performance.
Exemple:
<span><span><span class="hljs-variable">$it</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InfiniteIterator</span></span><span>(</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">ArrayIterator</span></span><span>([</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>]));
</span><span><span class="hljs-variable">$count</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iterator_count</span></span><span>(</span><span><span class="hljs-variable">$it</span></span><span>); </span><span><span class="hljs-comment">// Ça ne finira jamais</span></span><span>
</span></span>
Solution:
Utiliser uniquement pour une gamme de données limitée et connue.
Évitez les appels directs dans des structures de données infinies ou grandes.
Envisagez d'implémenter la logique de comptage personnalisée.
Assurez-vous que l'itérateur n'est pas partiellement traversé avant utilisation ou réinitialisez le pointeur via Rewind () .
Évitez d'appeler ITERATOR_COUNT () directement pour les itérateurs non réutilisables (comme les générateurs) . Vous pouvez utiliser iterator_to_array () pour le convertir avant de compter.
Évitez d'appeler cette fonction sur des itérateurs infinis ou à haut rendement , évaluant d'abord le coût de l'exécution.
Écrivez le code de test pour vérifier le comportement , en particulier pour les objets de type Traversable renvoyés par des bibliothèques tierces.