Загляните вперед, когда итерация массива в PHP

Возможно ли «заглянуть вперед» при повторении массива в PHP 5.2? Например, я часто использую foreach для управления данными из массива:

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

Но мне часто нужно заглядывать в следующий элемент, проходя через массив. Я знаю, что могу использовать цикл for и ссылаться на следующий элемент по его индексу ( $array[$i+1] ), но он не будет работать для ассоциативных массивов. Есть ли элегантное решение для моей проблемы, возможно, связано с SPL?

Related of "Загляните вперед, когда итерация массива в PHP"

Для этого вы можете использовать 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 всегда будет пытаться преобразовать текущий элемент в строку. Если вы хотите выполнить итерацию по коллекции объектов и получить доступ к свойствам методов, передайте 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 и ссылаться на следующий элемент по его индексу ($ array [$ i + 1]), но он не будет работать для ассоциативных массивов.

Подумайте о преобразовании вашего ассоциативного массива в последовательно индексированный с помощью array_values ​​() , что позволит использовать простое решение для цикла.