|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-07-29 22:54 UTC] seva dot lapsha at gmail dot com
Description:
------------
AppendIterator::append($iterator) calls $iterator->rewind() with no reason.
This causes append to happen twice:
1) when $iterator appended;
2) when $iterator starts iterating.
Reproduce code:
---------------
<?php
class ArrayIterator1 extends ArrayIterator {
function rewind() {
echo ".";
parent::rewind();
}
}
$i1 = new ArrayIterator1(array(1, 2, 3));
$i2 = new ArrayIterator1(array(4, 5, 6));
$i = new AppendIterator();
$i->append($i1);
$i->append($i2);
foreach ($i as $n) {
echo $n;
}
?>
Expected result:
----------------
.123.456
rewind() of each append()ed iterator should be called on demand when iterating and not when append()ing.
Actual result:
--------------
..123.456
On each append() each append()ed iterator's rewind is called with no need.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Oct 26 01:00:01 2025 UTC |
The rewind is invoked only on the first appended (not empty) inner-iterator. workaround: $workaround = new ArrayIterator(array('delete_me_after_all_append_calls_are_done')); $a = new ArrayIterator(array('a', 'b')); $b = new ArrayIterator(array('c', 'd')); $append = new AppendIterator(); $append->append($workaround); // invokes implicit: // $workaround->rewind(); // $workaround->valid(); // $workaround->current(); // $workaround->key(); // $workaround->rewind(); $append->append($a); $append->append($b); unset($workaround[0]); // no further append calls are allowed, // otherwise it seems to hang up in infinite loop