Вы можете использовать CachingIterator для этой цели.
Вот пример:
$collection = new CachingIterator(
new ArrayIterator(
array('Cat', 'Dog', 'Elephant', 'Tiger', 'Shark')));
CachingIterator всегда на один шаг позади внутреннего итератора:
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
в качестве второго параметра конструктору.
В sidenote CachingIterator получил свое имя благодаря способности кэшировать все результаты, которые он повторял до сих пор. Чтобы это работало, вы должны создать его экземпляр с помощью CachingIterator::FULL_CACHE
, а затем вы можете получить кэшированные результаты с помощью getCache()
.