Вы можете использовать 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
в качестве второго параметра в конструктор.
На заметка на поля, то CachingIterator получает это имя от способности кэшировать все результаты он итерированные над до сих пор. Для этого вам необходимо создать экземпляр с помощью CachingIterator::FULL_CACHE
, а затем вы можете получить кешированные результаты с помощью getCache()
.
+1 Даже не знал, что эти ([x] итераторы) существуют, очень полезны, espec the DirectoryIterator.Это спасет меня от загрузки большого объема работы в следующий раз, когда я делаю файлы. Спасибо :) – Psytronic
@Psytronic они действительно опрятные. Возможность складывать их позволяет очень классно и гибко. К сожалению, документы плохо документированы, но посмотрите http://www.phpro.org/tutorials/Introduction-to-SPL.html – Gordon
К сожалению, решение не работает, если массив содержит объекты, а не строки. Я получаю следующее исключение: 'Catchable fatal error: Объект класса MySampleClass не может быть преобразован в строку в /home/www/test.php в строке 398' – pako