当前的PHP foreach项目是Iterator中的最后一项吗?

时间:2015-11-19 18:40:05

标签: php

迭代Php中的迭代器时,例如symfonys finder(composer require symfony/finder):

$files = \Symfony\Component\Finder\Finder::create()
            ->in('searchdir')
            ->directories()
            ->depth(0)
            ->sortByType();
foreach ($files as $file) {
    //is $file the last element?
}

检查$file迭代器中的最后一项是$files的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

如果你正在迭代一些东西,而你实际上关心的是项目的索引,你可以选择经典的结构:

for($i=0; $i<count($iterator);$i++) {
    if($i==count($iterator)-1) {
        // You reached the last item
    }
}

或者使用$ key =&gt; $这样的值:

foreach($iterator as $iteratorKey=>$iteratorValue) {
    if($iteratorKey==count($iterator)-1) {
        // You reached the last item
    }
}

答案 1 :(得分:0)

由于我收到的两个回答是明显错误的,所以让我回答一下我发现的问题:

方法1

你可以得到这样的最后一个键:

array

然后比较迭代中的键:

$last = null;
foreach($files as $key => $value) {
   $last = $key;
}

方法2

如果你的迭代器实现了foreach ($iterator as $key => $value) { if ($key === $last) { .... } } 方法并且是seek(或者有Countable - 方法),那么你也可以获得这样的最后一个键:

count

这似乎是最初的清洁解决方案,但根据我对symfonys finder类的测试(5000个文件,测试了两次方法100次),这比使用foreach函数慢〜3倍。一位专家能说出原因吗?

方法3

我现在使用的解决方案,因为它创建尽可能少的开销(如果迭代器不是$iterator->seek(count($iterator) - 1); $last = $iterator->key(); (大多数是),请使用iterator_count而不是Countable) :

count

答案 2 :(得分:0)

您也可以这样做:

$cachingIterator = new \CachingIterator($iterator, \CachingIterator::FULL_CACHE);

while ($iterator->valid()) {
    $cachingIterator->next();
}

$lastKey = $cachingIterator->key();
$lastCurrentValue = $cachingIterator->current();

这是在Last operationloophp/collection中实现的。