PHP迭代器Iterator接口

介绍

创新互联长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为天峨企业提供专业的网站设计、成都做网站,天峨网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。

可在内部迭代自己的外部迭代器或类的接口。

  
Iterator extends Traversable
{
    /* 方法 */
    abstract public mixed current(void)
    abstract public scalar key(void)
    abstract public void next(void)
    abstract public void rewind(void )
    abstract public boolean valid(void)
}

举个栗子,定义一个迭代器:

class myIerator implements Iterator
{
    protected $position;//指针
    public $arr = [];

    public function __construct(array $arr)
    {
        $info = date('Y-m-d H:i:s') . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n";
        $this->writeLog($info);
        $this->arr = $arr;
        return $this;
    }

    //获取当前的值
    public function current()
    {
        $info = date('Y-m-d H:i:s') . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n";
        $this->writeLog($info);
        return $this->arr[$this->position] ?? null;
    }

    //将指针移至下一位
    public function next()
    {
        $info = date('Y-m-d H:i:s') . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n";
        $this->writeLog($info);
        return ++$this->position;
    }

    //返回当前的指针
    public function key()
    {
        $info = date('Y-m-d H:i:s') . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n";
        $this->writeLog($info);
        return $this->position;
    }


    //重置指针
    public function rewind()
    {
        $info = date('Y-m-d H:i:s') . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n";
        $this->writeLog($info);
        $this->position = 0;
    }

    //检查当前是否有效
    public function valid()
    {
        $info = date('Y-m-d H:i:s') . ' ' . __METHOD__ . ' Line :' . __LINE__ . "\r\n";
        $this->writeLog($info);
        return isset($this->arr[$this->position]);
    }

    private function writeLog(string $info)
    {
        error_log($info, 3, './debug.log');
    }
}

$zhangsan=['one','two','three','four'];
$arr = new myIerator($zhangsan);
foreach ($arr as $k => $v) {
    echo "{$k} => {$v} \r\n";
}

打印结果:

0 => one
1 => two
2 => three
3 => four

查看调用日志:

2017-11-27 15:56:04 myIerator::__construct Line :16

2017-11-27 15:56:04 myIerator::rewind Line :50    重置指针
2017-11-27 15:56:04 myIerator::valid Line :58        校验是否有效
2017-11-27 15:56:04 myIerator::current Line :25    获取当前指针的值
2017-11-27 15:56:04 myIerator::key Line :41          获取当前指针位置
2017-11-27 15:56:04 myIerator::next Line :33        指针下移一位(进入下一个循环)

2017-11-27 15:56:04 myIerator::valid Line :58
2017-11-27 15:56:04 myIerator::current Line :25
2017-11-27 15:56:04 myIerator::key Line :41
2017-11-27 15:56:04 myIerator::next Line :33

2017-11-27 15:56:04 myIerator::valid Line :58
2017-11-27 15:56:04 myIerator::current Line :25
2017-11-27 15:56:04 myIerator::key Line :41
2017-11-27 15:56:04 myIerator::next Line :33

2017-11-27 15:56:04 myIerator::valid Line :58
2017-11-27 15:56:04 myIerator::current Line :25
2017-11-27 15:56:04 myIerator::key Line :41
2017-11-27 15:56:04 myIerator::next Line :33

2017-11-27 15:56:04 myIerator::valid Line :58


//遍历方式二:
$arr->rewind();
while($arr->valid()) {
   $key=$arr->key();
   $value=$arr->current();

   echo"{$key} =>{$value}\r";

   $arr->next();
}

网页名称:PHP迭代器Iterator接口
标题URL:http://scyanting.com/article/jdijeg.html