Pregunta

Es posible que para "dar un vistazo por delante", mientras que recorrer un array en PHP 5.2?Por ejemplo, a menudo el uso de foreach para manipular datos de una matriz:

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

Pero a menudo me necesita para echar un vistazo a la siguiente elemento, mientras que ir a través de la matriz.Sé que yo podría utilizar un for bucle de referencia y el siguiente elemento es el índice ($array[$i+1]), pero no trabajo para matrices asociativas.¿Hay alguna solución elegante para mi problema, tal vez en relación con el SPL?

¿Fue útil?

Solución

Puede utilizar el CachingIterator para este propósito.

Aquí es 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 interno será el próximo elemento ya, lo que le permite mirar en él:

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 la necesidad de acceder a las propiedades una métodos, pasar CachingIterator::TOSTRING_USE_CURRENT como el segundo parámetro al 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, usted tiene que crear una instancia con CachingIterator::FULL_CACHE y luego se puede recuperar los resultados en caché con getCache().

Otros consejos

Uso array_keys.

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

Puede utilizar next y prev para iterar una matriz. current devuelve el valor de los artículos actual y key la clave actual.

Por lo que podría 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);
}

Sé que esta es una entrada antigua, pero puedo explicar que la corriente próxima cosa / / prev mejor ahora. 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

Sé que yo podría utilizar un bucle for de referencia y el elemento siguiente al de su índice ($array[$i+1]), pero no trabajo para matrices asociativas.

Considere la posibilidad de convertir la matriz asociativa en una forma secuencial indexado uno con array_values(), lo que le permite utilizar el simple bucle for solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top