Edit report at https://bugs.php.net/bug.php?id=63077&edit=1
ID: 63077 Comment by: david at grudl dot com Reported by: david at grudl dot com Summary: AppendIterator sometimes iterates 2 times over first iterator Status: Open Type: Bug Package: SPL related PHP Version: 5.4.6 Block user comment: N Private report: N New Comment: It is caused by append() method, because this code: $iterator = new RecursiveDirectoryIterator('one', RecursiveDirectoryIterator::SKIP_DOTS); $iterator = new RecursiveIteratorIterator($iterator); $iterator = new Filter($iterator); foreach($iterator as $file){ echo $file, "\n"; } returns correctly two items, but this code: $iterator = new RecursiveDirectoryIterator('one', RecursiveDirectoryIterator::SKIP_DOTS); $iterator = new RecursiveIteratorIterator($iterator); $iterator = new Filter($iterator); $append = new AppendIterator(); $append->append($iterator); foreach($iterator as $file){ // still using $iterator, not $append echo $file, "\n"; } returns 4 items. Previous Comments: ------------------------------------------------------------------------ [2012-09-13 00:32:41] david at grudl dot com Description: ------------ Due to this bug I cannot use PHP AppendIterator because it gives wrong (doubled) results. It is very hard to explain it, so there is isolated use case http://davidgrudl.com/tmp/appenditerator.zip It affects all PHP versions. Test script: --------------- /* Directory structure: /one a /b c d /two */ class Filter extends FilterIterator { public function accept() { $this->x++; return $this->x > 1; } } $append = new AppendIterator(); $iterator = new RecursiveDirectoryIterator('one', RecursiveDirectoryIterator::SKIP_DOTS); $iterator = new RecursiveIteratorIterator($iterator); $iterator = new Filter($iterator); $append->append($iterator); $iterator = new RecursiveDirectoryIterator('two'); $iterator = new RecursiveIteratorIterator($iterator); $append->append($iterator); foreach($append as $file){ echo $file, "\n"; } Expected result: ---------------- Should print: one/b/c one/b/d Actual result: -------------- Prints: one/b/c one/b/d one/b/c one/b/d ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=63077&edit=1