迭代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
的最佳方法是什么?
答案 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)
由于我收到的两个回答是明显错误的,所以让我回答一下我发现的问题:
你可以得到这样的最后一个键:
array
然后比较迭代中的键:
$last = null;
foreach($files as $key => $value) {
$last = $key;
}
如果你的迭代器实现了foreach ($iterator as $key => $value) {
if ($key === $last) {
....
}
}
方法并且是seek
(或者有Countable
- 方法),那么你也可以获得这样的最后一个键:
count
这似乎是最初的清洁解决方案,但根据我对symfonys finder类的测试(5000个文件,测试了两次方法100次),这比使用foreach函数慢〜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 operation的loophp/collection中实现的。