29 votes

Jetez un œil lors de l'itération d'un tableau en PHP

Est-il possible de "jeter un œil" tout en itérant un tableau en PHP 5.2? Par exemple, j'utilise souvent foreach pour manipuler les données d'un tableau:

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

Mais j'ai souvent besoin de jeter un œil à l'élément suivant en parcourant le tableau. Je sais que je pourrais utiliser une boucle for et référencer l'élément suivant par son index ( $array[$i+1] ), mais cela ne fonctionnerait pas pour les tableaux associatifs. Existe-t-il une solution élégante à mon problème, impliquant peut-être SPL?

57voto

Gordon Points 156415

Vous pouvez utiliser le CachingIterator à cette fin.

Voici un exemple:

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

Le CachingIterator est toujours un temps de retard sur l'intérieure de la itérateur:

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

Ainsi, lorsque vous effectuez foreach sur $collection, l'élément courant de l'intérieur de la ArrayIterator sera le prochain élément déjà, vous permettant d'œil sur elle:

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

Sortie:

Current: Cat - Next:Dog
Current: Dog - Next:Elephant
Current: Elephant - Next:Tiger
Current: Tiger - Next:Shark
Current: Shark

Pour une raison que je ne peux expliquer, le CachingIterator va toujours essayer de convertir le courant de l'élément de la chaîne. Si vous souhaitez effectuer une itération sur une collection d'objets et ont besoin d'accéder aux propriétés et méthodes, pass CachingIterator::TOSTRING_USE_CURRENT tant que le deuxième paramètre du constructeur.


Sur une note, le CachingIterator arrive c'est le nom de la possibilité de mettre en cache tous les résultats qu'il a itéré jusqu'à présent. Pour que cela fonctionne, vous devez instancier il avec CachingIterator::FULL_CACHE , puis vous pouvez récupérer les résultats mis en cache avec getCache().

20voto

Bart van Heukelom Points 11977

Utilisez array_keys .

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

8voto

Gumbo Points 279147

Vous pouvez utiliser next et prev pour itérer un tableau. current renvoie la valeur actuelle des éléments et key la clé actuelle.

Vous pouvez donc faire quelque chose comme ceci:

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

    // …

    next($array);
}
 

4voto

Juhani Points 31

Je sais que c'est un ancien post, mais je peux mieux expliquer cette chose actuelle / suivante / précédente maintenant. Exemple:

 $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
 

0voto

Noumenon Points 252

Je sais que je pourrais utiliser une boucle for et référencer l'élément suivant par son index ($ array [$ i + 1]), mais cela ne fonctionnerait pas pour les tableaux associatifs.

Envisagez de convertir votre tableau associatif en un tableau indexé séquentiellement avec array_values () , ce qui vous permet d'utiliser la solution simple for loop.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X