recorrer multidimensional manejo llenar elementos comparar asociativo array agregar php arrays foreach spl

multidimensional - Eche un vistazo hacia adelante al iterar una matriz en PHP



recorrer array asociativo php (5)

¿Es posible "mirar hacia adelante" mientras se itera una matriz en PHP 5.2? Por ejemplo, a menudo uso foreach para manipular datos de una matriz:

foreach($array as $object) { // do something }

Pero a menudo necesito echar un vistazo al siguiente elemento mientras atravieso la matriz. Sé que podría usar un bucle for y hacer referencia al siguiente elemento por su índice ( $array[$i+1] ), pero no funcionaría para matrices asociativas. ¿Hay alguna solución elegante para mi problema, tal vez con SPL?


Sé que podría usar un bucle for y hacer referencia al siguiente elemento por su índice ($ array [$ i + 1]), pero no funcionaría para matrices asociativas.

Considere la posibilidad de convertir su matriz asociativa en una indexada secuencialmente con array_values() , permitiéndole usar la solución simple para bucle.


Puedes usar next y prev para iterar una matriz. current devuelve el valor de los elementos actuales y la key la clave actual.

Así que podrías hacer algo como esto:

while (key($array) !== null) { next($array); if (key($array) === null) { // end of array } else { $nextItem = value($array); } prev($array); // … next($array); }


Puedes usar el CachingIterator para este propósito.

Aquí hay un ejemplo:

$collection = new CachingIterator( new ArrayIterator( array(''Cat'', ''Dog'', ''Elephant'', ''Tiger'', ''Shark'')));

El CachingIterator siempre está un paso por detrás del iterador interno:

var_dump( $collection->current() ); // null var_dump( $collection->getInnerIterator()->current() ); // Cat

Por lo tanto, cuando hagas foreach over $collection , el elemento actual del ArrayIterator interno ya será el siguiente elemento, lo que te permitirá echarle un vistazo:

foreach($collection as $animal) { echo "Current: $animal"; if($collection->hasNext()) { echo " - Next:" . $collection->getInnerIterator()->current(); } echo PHP_EOL; }

Saldrá:

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, el CachingIterator siempre intentará convertir el elemento actual en una cadena. Si desea iterar sobre una colección de objetos y necesita acceder a propiedades y métodos, pase CachingIterator::TOSTRING_USE_CURRENT como segundo parámetro al constructor.

En una nota al margen, el CachingIterator obtiene su nombre por la capacidad de almacenar en caché todos los resultados sobre los que se ha repetido hasta ahora. Para que esto funcione, debe crear una instancia con CachingIterator::FULL_CACHE y luego puede obtener los resultados almacenados en caché con getCache() .


Sé que esta es una publicación antigua, pero ahora puedo explicar mejor esa situación actual / siguiente / anterior. Ejemplo:

$array = array(1,2,3,2,5); foreach($array as $k => $v) { // in foreach when looping the key() and current() // is already pointing to the next record // And now we can print current print ''current key: ''.$k.'' and value: ''.$v; // if we have next we can print its information too (key+value) if(current($array)) { print '' - next key: ''.key($array).'' and value: ''.current($array); // at the end we must move pointer to next next($array); } print ''<br>''; } // prints: // current key: 0 and value: 1 - next key: 1 and value: 2 // current key: 1 and value: 2 - next key: 2 and value: 3 // current key: 2 and value: 3 - next key: 3 and value: 2 // current key: 3 and value: 2 - next key: 4 and value: 5 // current key: 4 and value: 5


Utilice array_keys .

$keys = array_keys($array); for ($i = 0; $i < count($keys); $i++) { $cur = $array[$keys[$i]]; $next = $array[$keys[$i+1]]; }