質問

PHP 5.2 で配列を反復処理するときに「先読み」することは可能ですか?たとえば、私はよく foreach を使用して配列のデータを操作します。

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

ただし、配列を調べているときに次の要素を確認する必要があることがよくあります。を使用できることはわかっています for ループし、インデックスによって次の項目を参照します ($array[$i+1])、ただし、連想配列では機能しません。おそらく SPL が関係する、私の問題に対する洗練された解決策はありますか?

役に立ちましたか?

解決

あなたは、この目的のための CachingIterator に使用することができます。

ここでは一例であります:

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

CachingIteratorは常に内部イテレータの背後にある一歩である。

var_dump( $collection->current() ); // null
var_dump( $collection->getInnerIterator()->current() ); // Cat
あなたはforeach$collectionを行う際に、

このように、インナーArrayIteratorの現在の要素は、あなたがそれに覗かすることができ、すでに次の要素になります:

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

ウィル出力ます:

Current: Cat - Next:Dog
Current: Dog - Next:Elephant
Current: Elephant - Next:Tiger
Current: Tiger - Next:Shark
Current: Shark
<時間>

私が説明することはできませんいくつかの理由について、CachingIteratorは常に文字列に現在の要素を変換しようとします。あなたがオブジェクトのコレクションを反復処理したいとプロパティメソッドにアクセスする必要がある場合は、コンストラクタの二番目のparamとしてCachingIterator::TOSTRING_USE_CURRENTを渡します。

<時間>

追記では、CachingIteratorは、それがこれまで以上繰り返したすべての結果をキャッシュする機能から名前です取得します。これが機能するために、あなたはCachingIterator::FULL_CACHEとそれをインスタンス化する必要があり、その後、あなたはgetCache()でキャッシュされた結果を取得することができます。

他のヒント

array_keysを使用します。

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

使用できます next そして prev 配列を反復処理します。 current 現在の項目の値を返します。 key 現在のキー。

したがって、次のようなことができます。

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

    // …

    next($array);
}

私は、これは古い記事であることを知っているが、私は今より良い電流/次/前の事を説明することができます。 例:

$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
  

私は、forループを使用することができる知っていると、そのインデックス($配列[$ I + 1])によって、次の項目を参照し、それは連想配列では動作しないだろう。

順番にあなたの連想配列を変換検討 array_values()<のものをインデックス付け/ A>、あなたはループの解決のために、単純なを使用することができます。

scroll top