Edit report at https://bugs.php.net/bug.php?id=63077&edit=1
ID: 63077
Comment by: j dot tvr at centrum dot cz
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 seems to be related to https://bugs.php.net/bug.php?id=49104 because the
suggested workaround works for me.
Previous Comments:
------------------------------------------------------------------------
[2012-09-13 00:48:19] david at grudl dot com
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.
------------------------------------------------------------------------
[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