Bug #63077 [Com]: AppendIterator sometimes iterates 2 times over first iterator
| From: | david at grudl dot com | Date: | Thu, 13 Sep 2012 00:48:19 +0000 |
| Subject: | Bug #63077 [Com]: AppendIterator sometimes iterates 2 times over first iterator | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-173389@lists.php.net to get a copy of this message | ||
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