PHP bir dizi yineleme zaman önde Peek

4 Cevap php

PHP 5.2 bir dizi yineleme sırasında "Devam peek" mümkün mü? Örneğin, sık sık bir dizi veri işlemek için foreach kullanın:

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

Dizi geçerken ama genellikle bir sonraki elemanına gözetleme gerekir. Ben bir for döngü kullanmak ve endeksinde ($array[$i+1]) tarafından bir sonraki öğeyi referans olabileceğini biliyorum, ama ilişkisel diziler için işe yaramaz. Belki SPL içeren benim problem için herhangi şık bir çözüm var mı?

4 Cevap

Bu amaç için CachingIterator kullanabilirsiniz.

İşte bir örnek:

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

CachingIterator daima iç yineleyici arkasında bir adımdır:

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

Eğer foreach üzerinde yaptığınızda Böylece, $collection, iç ArrayIterator mevcut eleman bunu içine peek sağlayan, zaten sonraki unsur olacaktır:

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

Çıktısı:

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

Ben izah edilemez nedense, CachingIterator her dize geçerli öğenin dönüştürmek için çalışacağız. Eğer bir nesne topluluğu üzerinde yineleme ve özelliklerinin bir yöntemlerine erişmek için gereken, kurucu ikinci parametre olarak CachingIterator::TOSTRING_USE_CURRENT geçmek istiyorum.


Bir dipnot düşmek, CachingIterator o kadar iterated olan tüm sonuçları önbelleğe yeteneği isim alır. Bu çalışması için, CachingIterator::FULL_CACHE ile oluşturmaya ve daha sonra getCache() ile önbelleğe sonuçlar getirebilir var.

Kullan array_keys.

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

Ben döngü için bir kullanmak ve indeksi ile ($ dizi [$ i +1]) sonraki öğeyi referans olabileceğini biliyorum, ama ilişkisel diziler için işe yaramaz.

Eğer döngü çözüm için basit kullanmak için izin, array_values() ile tek endeksli bir sırayla içine ilişkisel dizi dönüştürme düşünün.