在 PHP 中迭代数组时偷看
在 PHP 5.2 中迭代数组时,是否可以“偷看”数组?例如,我经常使用 foreach 来操作数组中的数据:
foreach($array as $object) {
// do something
}
但是我经常需要在浏览数组时偷看下一个元素。我知道我可以使用一个循环,并通过它的索引()引用下一项,但它不适用于关联数组。对于我的问题,是否有任何优雅的解决方案,也许涉及SPL?for
$array[$i+1]
在 PHP 5.2 中迭代数组时,是否可以“偷看”数组?例如,我经常使用 foreach 来操作数组中的数据:
foreach($array as $object) {
// do something
}
但是我经常需要在浏览数组时偷看下一个元素。我知道我可以使用一个循环,并通过它的索引()引用下一项,但它不适用于关联数组。对于我的问题,是否有任何优雅的解决方案,也许涉及SPL?for
$array[$i+1]
您可以使用缓存编辑器来实现此目的。
下面是一个示例:
$collection = new CachingIterator(
new ArrayIterator(
array('Cat', 'Dog', 'Elephant', 'Tiger', 'Shark')));
CachingIterator 总是落后于内部迭代器一步:
var_dump( $collection->current() ); // null
var_dump( $collection->getInnerIterator()->current() ); // Cat
因此,当您完成时,内部 ArrayIterator 的当前元素已经是下一个元素,允许您窥视它:foreach
$collection
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]];
}