|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-09-13 00:32 UTC] 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 PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 00:00:02 2025 UTC |
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.