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

Reply via email to