下面我们来了解如何实现一个自定义的迭代器,然后再开始慢慢理解迭代器的内部工作原理。先来看一个官方的例子:

class myIterator implements Iterator {
private $position = 0;
private $array = array(
"first_element",
"second_element",
"last_element",
); public function __construct() {
$this->position = 0;
} function rewind() {
var_dump(__METHOD__);
$this->position = 0;
} function current() {
var_dump(__METHOD__);
return $this->array[$this->position];
} function key() {
var_dump(__METHOD__);
return $this->position;
} function next() {
var_dump(__METHOD__);
++$this->position;
} function valid() {
var_dump(__METHOD__);
return isset($this->array[$this->position]);
}
} $it = new myIterator; foreach($it as $key => $value) {
echo '输出键值:';
var_dump($key, $value);
//echo $key;
echo "\n";
}

程序运行输出:

string(18) "myIterator::rewind"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
输出键值:int(0)
string(13) "first_element" string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
输出键值:int(1)
string(14) "second_element" string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
输出键值:int(2)
string(12) "last_element" string(16) "myIterator::next"
string(17) "myIterator::valid"

一般的迭代器内部需要下面的方法:

  • Iterator::current — Return the current element 返回当前元素
  • Iterator::key — Return the key of the current element 返回当前元素的键
  • Iterator::next — Move forward to next element 移向下一个元素
  • Iterator::rewind — Rewind the Iterator to the first element 重新回到第一个元素
  • Iterator::valid — Checks if current position is valid 检查当前位置的有效性

如果不是很清楚迭代器的内容工作流程,可以查看下面的迭代器对数组的遍历过程:

class MyIterator implements Iterator
{
private $var = array(); public function __construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
} public function rewind() {
echo "回到第一个元素\n";
reset($this->var);
} public function current() {
$var = current($this->var);
echo "当前元素: $var\n";
return $var;
} public function key() {
$var = key($this->var);
echo "当前元素的键: $var\n";
return $var;
} public function next() {
$var = next($this->var);
echo "移向下一个元素: $var\n";
return $var;
} public function valid() {
$var = $this->current() !== false;
echo "检查有效性: {$var}\n";
return $var;
}
} $values = array(1,2,3);
$it = new MyIterator($values); foreach ($it as $k => $v) {
print "此时键值对 -- key $k: value $v\n\n";
}

程序运行结果:

回到第一个元素
当前元素: 1
检查有效性: 1
当前元素: 1
当前元素的键: 0
此时键值对 -- key 0: value 1 移向下一个元素: 2
当前元素: 2
检查有效性: 1
当前元素: 2
当前元素的键: 1
此时键值对 -- key 1: value 2 移向下一个元素: 3
当前元素: 3
检查有效性: 1
当前元素: 3
当前元素的键: 2
此时键值对 -- key 2: value 3 移向下一个元素:
当前元素:
检查有效性:

最新文章

  1. SSH+DWZ、JQuery-UI ,swfobject.embedSWF属性与用法,IE下日期控件被flash控件挡住
  2. 使用Nginx和Logstash以及kafka来实现网站日志采集的详细步骤和过程
  3. [Python]计算豆瓣电影TOP250的平均得分
  4. [Everyday Mathematics]20150208
  5. HW6.13
  6. 细说 ASP.NET Cache 及其高级用法
  7. webpack打包编译时,不识别src目录以外的js或css
  8. 网页窗口logo图标设置
  9. Android——Fragment过度动画分析一(转)
  10. [APP] Android 开发笔记 001-环境搭建与命令行创建项目
  11. 怎样在Ubuntu中修改默认程序
  12. Velocity工作原理解析和优化
  13. Win7下SQLPlus登录时报错"SP2-1503:无法初始化Oracle调用界面"
  14. weblogic 12c重置console密码
  15. 白盒测试实践项目(day6)
  16. Myeclipse快捷键的设置以及默认的编码格式
  17. windows获取屏幕显示比例 读取注册表法
  18. Koa1 框架
  19. [VC]vc中socket编程步骤
  20. 对xml文件的sax解析(增删改查)之一

热门文章

  1. 松哥整理了 15 道 Spring Boot 高频面试题,看完当面霸
  2. UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)
  3. HDU 4517
  4. POJ 2019 Cornfields 二维线段树的初始化与最值查询
  5. [Java]对字符串中的每一个单词个数进行统计
  6. 使用Html5和Js进行拖动
  7. iOS 加入粘贴板的功能(复制功能)
  8. Linux 下的时间编程总结
  9. SpringMVC实战(三种映射处理器)
  10. jcaptcha进阶