介绍

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

IteratorextendsTraversable{/*方法*/abstractpublicmixedcurrent(void)abstractpublicscalarkey(void)abstractpublicvoidnext(void)abstractpublicvoidrewind(void)abstractpublicbooleanvalid(void)}


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

classmyIeratorimplementsIterator{protected$position;//指针public$arr=[];publicfunction__construct(array$arr){$info=date('Y-m-dH:i:s').''.__METHOD__.'Line:'.__LINE__."\r\n";$this->writeLog($info);$this->arr=$arr;return$this;}//获取当前的值publicfunctioncurrent(){$info=date('Y-m-dH:i:s').''.__METHOD__.'Line:'.__LINE__."\r\n";$this->writeLog($info);return$this->arr[$this->position]??null;}//将指针移至下一位publicfunctionnext(){$info=date('Y-m-dH:i:s').''.__METHOD__.'Line:'.__LINE__."\r\n";$this->writeLog($info);return++$this->position;}//返回当前的指针publicfunctionkey(){$info=date('Y-m-dH:i:s').''.__METHOD__.'Line:'.__LINE__."\r\n";$this->writeLog($info);return$this->position;}//重置指针publicfunctionrewind(){$info=date('Y-m-dH:i:s').''.__METHOD__.'Line:'.__LINE__."\r\n";$this->writeLog($info);$this->position=0;}//检查当前是否有效publicfunctionvalid(){$info=date('Y-m-dH:i:s').''.__METHOD__.'Line:'.__LINE__."\r\n";$this->writeLog($info);returnisset($this->arr[$this->position]);}privatefunctionwriteLog(string$info){error_log($info,3,'./debug.log');}}


$zhangsan=['one','two','three','four'];$arr=newmyIerator($zhangsan);foreach($arras$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();
}