PHP迭代器Iterator接口

释放双眼,带上耳机,听听看~!

介绍

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

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/n";

    $arr->next();
}

【转自慕课】https://www.imooc.com

PHP

使用Django的xadmin作为php后台管理系统遇到的问题(一)

2022-3-3 5:03:21

PHP

Laravel 中间件的简单用法

2022-3-3 5:09:46

搜索