xxl520 发表于 2018-12-13 06:17:14

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();
}


页: [1]
查看完整版本: PHP迭代器Iterator接口