Edit report at https://bugs.php.net/bug.php?id=52560&edit=1
ID: 52560 Updated by: le...@php.net Reported by: tobias382 at gmail dot com Summary: FilterIterator errantly returns null for first element -Status: Assigned +Status: Not a bug Type: Bug Package: SPL related Operating System: Ubuntu 10.04 PHP Version: 5.3SVN-2010-08-07 (snap) -Assigned To: colder +Assigned To: levim Block user comment: N Private report: N New Comment: This is simply a common misunderstanding. Iterators need to be rewound before use. Whether that was a good design or not is debatable, but nonetheless this is not a bug. Previous Comments: ------------------------------------------------------------------------ [2010-08-07 04:49:28] tobias382 at gmail dot com Small amendment: $iterator->rewind() should be $this->rewind() in the overridden constructor in the test script. ------------------------------------------------------------------------ [2010-08-07 04:40:26] tobias382 at gmail dot com Description: ------------ Even when a FilterIterator subclass accepts all elements, it returns NULL for the first element in the original array. There are a few methods to correct this behavior, noted in the attached test script. Test script: --------------- <?php class FooIterator extends FilterIterator { /* // Forces this class to produce expected behavior below // (i.e. 1, 2, NULL instead of NULL, 2, NULL) public function __construct(Iterator $iterator) { parent::__construct($iterator); $iterator->rewind(); } */ // Should cause all elements to be accepted public function accept() { return true; } /* // Another way to force this class to produce expected behavior below public function current() { return $this->getInnerIterator()->current(); } */ } $array = array(1, 2); /* // What should happen in subsequent blocks $iterator1 = new ArrayIterator($array); var_dump($iterator1->current()); // int(1) $iterator1->next(); var_dump($iterator1->current()); // int(2) $iterator1->next(); var_dump($iterator1->current()); // NULL */ // The problem $iterator2 = new FooIterator(new ArrayIterator($array)); var_dump($iterator2->current()); // NULL <-- this should be int(1) $iterator2->next(); var_dump($iterator2->current()); // int(2) $iterator2->next(); var_dump($iterator2->current()); // NULL // Exhibits correct behavior with no changes to FooIterator $iterator3 = new FooIterator(new ArrayIterator($array)); $iterator3->rewind(); // This line shouldn't be needed, but is to force expected behavior var_dump($iterator3->current()); // int(1) $iterator3->next(); var_dump($iterator3->current()); // int(2) $iterator3->next(); var_dump($iterator3->current()); // NULL Expected result: ---------------- int(1) int(2) NULL int(1) int(2) NULL Actual result: -------------- NULL int(2) NULL int(1) int(2) NULL ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=52560&edit=1