イテレーターが部分的または完全にトラバースされている場合、 ITERATOR_Count()を呼び出して、残りの要素数または0を返します。
エラー例:
<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">// 1つのステップを移動します</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">// 戻る 3 その代わり 4</span></span><span>
</span></span>
解決:
iterator_count()を呼び出す前に、iteratorをリセットします。
<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">// ポインターをリセットします</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">// 戻る 4</span></span><span>
</span></span>
iterator_count()は、 iteratorを完全に横断します。データセットが巨大である場合、またはイテレーターに複雑なロジックが含まれている場合、深刻なパフォーマンスの問題を引き起こす可能性があります。
例:
<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">// それは決して終わりません</span></span><span>
</span></span>
解決:
限られた、既知のデータの範囲にのみ使用します。
無限または大規模なデータ構造での直接の呼び出しは避けてください。
カスタムカウントロジックの実装を検討してください。
使用前にイテレーターが部分的に通過しないことを確認するか、 rewind()を介してポインターをリセットしてください。
復活不可能なイテレーター(ジェネレーターなど)の場合、iterator_count()を直接呼び出してはいけません。 Iterator_to_array()を使用して、カウントする前に変換できます。
最初に実行コストを評価して、無限または高消費のイテレーターでこの関数を呼び出すことは避けてください。
特にサードパーティライブラリによって返されるトラバー可能なタイプオブジェクトの動作を確認するためのテストコードを書き込みます。