PHP-Iterator迭代器,遍历接口详讲

echo "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ";
class Test implements Iterator{
    private $list;
    private $i=0;
    private $valid=false;
    public function __construct($array=array()){
        $this->list=$array;
    }
    /**
     * 将索引指定到首个元素
     * {@inheritDoc}
     * @see Iterator::rewind() 
     */
    function rewind(){
        echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>';  
        $this->valid=(false !==reset($this->list));
    }
    /**
     * 返回当前元素
     * {@inheritDoc}
     * @see Iterator::current()
     */
    function current(){
        echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>';  
        return current($this->list);
    }
    /**
     * 索引指向下一个元素
     * {@inheritDoc}
     * @see Iterator::next()
     */
    function next(){
        echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>';  
        $this->valid=(false !== next($this->list));
    }
    /**
     * 返回当前元素键值
     * {@inheritDoc}
     * @see Iterator::key()
     */
    function key(){
        echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>';  
        return key($this->list);
    }
    /**
     * 判断下个是否有下个元素
     * {@inheritDoc}
     * @see Iterator::valid()
     */
    function valid(){
        echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>';  
        return $this->valid;
    }
}

$list=array(1,2,3);
$test=new Test($list);
//foreach循环方式
foreach ($test as $key=>$val){
    echo '输出索引为'.$key.'的元素值为:'.$val.'<br/><br/>';
}

echo '----------------结束分隔线-----------------------<br/>';
$second=new Test($list);
//while循环方式
$second->rewind();
while($second->valid()){
    echo '输出索引为'.$second->key().'的元素值为:'.$second->current().'<br/><br/>';
    $second->next();
}

echo '--------------------结束分隔线----------------------<br/>';

输出格式:

第1步:执行 Test::rewind

第1步:执行 Test::valid

第2步:执行 Test::current

第3步:执行 Test::key

输出索引为0的元素值为:1

第4步:执行 Test::next

第2步:执行 Test::valid

第5步:执行 Test::current

第6步:执行 Test::key

输出索引为1的元素值为:2

第7步:执行 Test::next

第3步:执行 Test::valid

第8步:执行 Test::current

第9步:执行 Test::key

输出索引为2的元素值为:3

第10步:执行 Test::next

第4步:执行 Test::valid

----------------结束分隔线-----------------------

第1步:执行 Test::rewind

第1步:执行 Test::valid

第2步:执行 Test::key

第3步:执行 Test::current

输出索引为0的元素值为:1

第4步:执行 Test::next

第2步:执行 Test::valid

第5步:执行 Test::key

第6步:执行 Test::current

输出索引为1的元素值为:2

第7步:执行 Test::next

第3步:执行 Test::valid

第8步:执行 Test::key

第9步:执行 Test::current

输出索引为2的元素值为:3

第10步:执行 Test::next

第4步:执行 Test::valid

--------------------结束分隔线----------------------

执行到valid返回false时,则循环结束