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();
- }
PHP迭代器Iterator接口
php 迭代器 iterator
原文:http://blog.51cto.com/phpme/2044921
来源: http://www.bubuko.com/infodetail-2409828.html