Puede utilizar el CachingIterator para este propósito.
Aquí se muestra un ejemplo:
$collection = new CachingIterator(
new ArrayIterator(
array('Cat', 'Dog', 'Elephant', 'Tiger', 'Shark')));
El CachingIterator es siempre un paso por detrás del iterador interno:
var_dump($collection->current()); // null
var_dump($collection->getInnerIterator()->current()); // Cat
Por lo tanto, cuando se hace foreach
sobre $collection
, el elemento actual de la ArrayIterator interior será el siguiente elemento ya, lo que le permite echarle un vistazo:
foreach($collection as $animal) {
echo "Current: $animal";
if($collection->hasNext()) {
echo " - Next:" . $collection->getInnerIterator()->current();
}
echo PHP_EOL;
}
salida será:
Current: Cat - Next:Dog
Current: Dog - Next:Elephant
Current: Elephant - Next:Tiger
Current: Tiger - Next:Shark
Current: Shark
Por alguna razón que no puedo explicar, la CachingIterator siempre tratará de convertir el elemento actual de la cadena. Si desea iterar sobre una colección de objetos y necesita acceder a las propiedades y métodos, pase CachingIterator::TOSTRING_USE_CURRENT
como el segundo parámetro para el constructor.
En una nota, la CachingIterator recibe su nombre de la capacidad de almacenar en caché todos los resultados que ha repiten a lo largo hasta el momento. Para que esto funcione, debe crear una instancia con CachingIterator::FULL_CACHE
y luego puede obtener los resultados almacenados en caché con getCache()
.
+1 Ni siquiera sabía que estos ([x] Iteradores) existían, muy útiles, especialmente el DirectoryIterator.Eso me va a ahorrar una gran cantidad de trabajo la próxima vez que haga cosas de archivos. Gracias :) – Psytronic
@Psytronic son muy bonitos. La capacidad de apilar permite cosas muy interesantes y flexibles. Lamentablemente, no está bien documentado, pero consulte http://www.phpro.org/tutorials/Introduction-to-SPL.html – Gordon
Desafortunadamente, la solución no funciona si la matriz contiene objetos y no cadenas. Obtengo la siguiente excepción: 'Error fatal capturable: el objeto de la clase MySampleClass no se pudo convertir a cadena en /home/www/test.php en la línea 398' – pako