Soroush Khosravi
Soroush Khosravi

Reputation: 917

PHP Iterator like mysql iterator?

Already I extended and implemented from SPL iterator.
But if I want to use it, I should use it on a foreach.
I tried to use it in a while like this:

$news = new testClass();

while( $row = $news )
    echo $row["name"];

It will create an infinite loop !
But with foreach, it works fine!

Here is top of my class:

class testClass implements \Iterator

Where is the mistake ?

Upvotes: 0

Views: 984

Answers (3)

Soroush Khosravi
Soroush Khosravi

Reputation: 917

Finally I created a simple example of this:

<?php

/**
 * @author Soroush Khosravi
 * @copyright 2013
 */
class _Iterator
{
    private $array;

    public function setArray(array $data)
    {
        $this->array = $data;
    }

    public function reader()
    {
        if (is_null($this->array))
            return false;

        $elem = array_shift($this->array);
        if (count ($this->array) > 0)
            return $elem;
        return false;
    }
}

Class child extends _Iterator
{
    function execute()
    {
        $this->setArray(array(1,2,3,4,5,6));
        return $this;
    }
}
$obj = new child;
$obj = $obj->execute();
while($row = $obj->reader())
    echo $row;

?>

Upvotes: 0

dev-null-dweller
dev-null-dweller

Reputation: 29462

foreach is language construct that iterates through all elements. while executes block of code until given condition is true. To make it work you have to use your own function that checks for valid key and returns current element.

Upvotes: 1

DavidDraughn
DavidDraughn

Reputation: 1131

Fist, bravo on using the SPL classes for this type of 'standard' problem. Too often have I seen inexperienced/sloppy developers (or even good ones that simply don't think ahead) reinvent the wheel in these types of situations.

You're missing some very important details about the implementation of the iterator interface.

see PHP:Iterator - Manual for more information, and the reference implementation from below.

First, you need to implement the, rewind, current, key, next, and valid functions. the reference implementation looks like this:

class myIterator implements Iterator {
    private $position = 0;
    private $array = array(
        "firstelement",
        "secondelement",
        "lastelement",
    );  

    public function __construct() {
        $this->position = 0;
    }

    function rewind() {
        var_dump(__METHOD__);
        $this->position = 0;
    }

    function current() {
        var_dump(__METHOD__);
        return $this->array[$this->position];
    }

    function key() {
        var_dump(__METHOD__);
        return $this->position;
    }

    function next() {
        var_dump(__METHOD__);
        ++$this->position;
    }

    function valid() {
        var_dump(__METHOD__);
        return isset($this->array[$this->position]);
        }
    }
)

And the code for traversing that implementation looks like this:

$it = new myIterator;

foreach($it as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}

Upvotes: 1

Related Questions