在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将始终尝试将当前元素转换为字符串。如果要遍历对象集合并需要访问方法的属性,则将CachingIterator::TOSTRING_USE_CURRENT作为第二个参数传递给构造函数。

在一个旁注中,CachingIterator的名称来自能够缓存到目前为止已迭代的所有结果的名称。为此,您必须使用CachingIterator::FULL_CACHE实例化它,然后可以使用getCache()获取缓存的结果。

09-15 20:26