首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP迭代器,就像mysql迭代器?

PHP迭代器,就像mysql迭代器?
EN

Stack Overflow用户
提问于 2013-02-03 20:43:21
回答 3查看 947关注 0票数 0

我已经通过SPL迭代器进行了扩展和实现。

但如果我想使用它,我应该在foreach上使用它。

我尝试在while中使用它,如下所示:

代码语言:javascript
复制
$news = new testClass();

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

它将创建一个无限循环!

但是对于foreach,它工作得很好!

下面是我的班级中的第一名:

代码语言:javascript
复制
class testClass implements \Iterator

错误在哪里?

EN

回答 3

Stack Overflow用户

发布于 2013-02-03 20:59:40

首先,使用SPL类来解决这类“标准”问题。我经常看到缺乏经验/草率的开发人员(甚至是优秀的开发人员根本不提前考虑)在这些类型的情况下重新发明轮子。

您遗漏了有关iterator接口实现的一些非常重要的细节。

有关更多信息,请参阅PHP:Iterator - Manual,以及下面的参考实现。

首先,您需要实现,rewind, current, key, next, and valid函数。参考实现如下所示:

代码语言:javascript
复制
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]);
        }
    }
)

遍历该实现的代码如下所示:

代码语言:javascript
复制
$it = new myIterator;

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

Stack Overflow用户

发布于 2013-02-03 21:00:05

foreach是遍历所有元素的语言构造。while执行代码块,直到给定的条件为真。为了让它工作,你必须使用你自己的函数来检查有效的key并返回当前元素。

票数 1
EN

Stack Overflow用户

发布于 2013-02-03 21:38:02

最后,我创建了一个简单的示例:

代码语言:javascript
复制
<?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;

?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14672571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档