<?php /** * 迭代器 * 使用php Iterator接口 * * 迭代器在遍历大文件,或者大数据的时候很有用,因为它不需要将数据一次性取出,而是即取即用。 * 使用yield生成器也可以实现相同效果。 */ class fileLineIterator implements Iterator { private $cur = NULL; private $nxt = NULL; private $lineCount = 0; public function __construct($filename) { $this->fp = fopen($filename, 'r'); } //在每次迭代之前初始化某些操作 public function rewind() { rewind($this->fp); $this->cur = fgets($this->fp); $this->nxt = fgets($this->fp); return true; } //获取当前元素的键 public function key() { return $this->lineCount++; } //获取当前元素的值 public function current() { return $this->cur; } //元素向前推一位 public function next() { $this->cur = $this->nxt; $this->nxt = fgets($this->fp); } //通过该操作判断迭代是否应该结束 public function valid() { return $this->cur===FALSE?FALSE:TRUE; } } $fileIter = new fileLineIterator('test_iterator.txt'); foreach($fileIter as $line) { var_dump($line,$fileIter->current()); }