この目的でCachingIteratorを使用できます。
次に例を示します。
$collection = new CachingIterator(
new ArrayIterator(
array('Cat', 'Dog', 'Elephant', 'Tiger', 'Shark')));
CachingIteratorは、常に内部イテレータの1つ後ろにあります。
var_dump( $collection->current() ); // null
var_dump( $collection->getInnerIterator()->current() ); // Cat
したがって、foreach
やり直す$collection
と、内側のArrayIteratorの現在の要素がすでに次の要素になり、それを覗き見できるようになります。
foreach($collection as $animal) {
echo "Current: $animal";
if($collection->hasNext()) {
echo " - Next:" . $collection->getInnerIterator()->current();
}
echo PHP_EOL;
}
出力します:
Current: Cat - Next:Dog
Current: Dog - Next:Elephant
Current: Elephant - Next:Tiger
Current: Tiger - Next:Shark
Current: Shark
説明できない理由で、CachingIteratorは常に現在の要素を文字列に変換しようとします。オブジェクトコレクションを反復処理し、メソッドのプロパティにアクセスする必要がある場合はCachingIterator::TOSTRING_USE_CURRENT
、2番目のパラメーターとしてコンストラクターに渡します。
ちなみに、CachingIteratorは、これまでに繰り返したすべての結果をキャッシュする機能からその名前を取得します。これを機能させるには、でインスタンス化する必要がCachingIterator::FULL_CACHE
あります。その後、でキャッシュされた結果をフェッチできますgetCache()
。