迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容。
各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java, C#, Python, Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicit iterator),但像是C++语言本身就没有Iterator的特色,但STL仍利用template实作了功能强大的iterator。
PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT.
对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach.
而对于ZEND_ITER_OBJECT的类对象,则会通过调用对象实现的Iterator接口相关函数来进行foreach。
06 |
class sample implements Iterator { |
09 |
public function __construct(&$data) { |
10 |
$this->_items = $data; |
12 |
public function current() { |
13 |
return current($this->_items); |
16 |
public function next() { |
20 |
public function key() { |
21 |
return key($this->_items); |
24 |
public function rewind() { |
28 |
public function valid() { |
29 |
return ($this->current() !== FALSE); |
34 |
$data = array(1, 2, 3, 4, 5); |
35 |
$sa = new sample($data); |
36 |
foreach ($sa AS $key => $row) { |
37 |
echo $key, ' ', $row, '<br />'; |
举几个迭代器的使用范围:
- 使用返回迭代器的包或库时(如PHP5中的SPL迭代器)
- 无法在一次的调用获取容器的所有元素时
- 要处理数量巨大的无素时(数据库中的表以GB计的数据)
- ……
不同的迭代器有不同的接口,例如PHP SPL迭代器中包括Next()(移动到下一个元素),corrent()(返回当前元素),valid()(检查迭代结尾),rewind()(从头重新开始),key()(返回当前元素的索引)。当然你可以自己写适合自己用的迭代器,也可以用系统中的迭代器。
一般是使用foreach来使用迭代器,下面整理了一下代码:
02 |
class sample implements Iterator |
04 |
private $_items = array(1,2,3,4,5,6,7); |
06 |
public function __construct() { |
09 |
public function rewind() { reset($this->_items); } |
10 |
public function current() { return current($this->_items); } |
11 |
public function key() { return key($this->_items); } |
12 |
public function next() { return next($this->_items); } |
13 |
public function valid() { return ( $this->current() !== false ); } |
17 |
foreach($sa as $key => $val){ |
18 |
print $key . "=>" .$val; |
while循环也可以:
2 |
while ($itertor->valid()){//判断是不是最后元素 |
3 |
$element=$itertor->current();//获取当前元素 |
4 |
$itertor->next();//移动到下一个元素 |
为什么要学习PHP的迭代器呢?有个很重要的原因:利用PHP的迭代器可以利用面向对象实现常见的数据结构,例如列表,堆栈,队列与图。后面会做一个专题,用PHP实现大部分的数据结构,而且以面向对象的形式。所以这里先预热了一下PHP的迭代器。
- ES6笔记(6)-- Set、Map结构和Iterator迭代器
系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...
- STL六大组件之——迭代器这个东西
迭代器:除了在其它语言中司空见惯的下标法访问容器元素之外,C++语言提供了一种全新的方法——迭代器(iterator)来访问容器的元素.迭代器其实类似于引用,指向容器中某一元素.换个方式来说,容器就是 ...
- STL容器底层数据结构的实现
C++ STL 的实现: 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque ...
- 【C++】:STL迭代器使用---[容器::iterator iter;]
参考文章:http://blog.csdn.net/qq_23100787/article/details/51388163 迭代器这种东西,就是为了使访问简单!! 容器::iterator iter ...
- JAVA学习第三十三课(经常使用对象API) —迭代器
数字有非常多用数组存,对象有非常多就要用集合存 可是数组是固定长度的,集合是可变长度的 集合的由来: 对象用来封装特有数据,对象多了须要存储,假设对象个数不确定,就须要使用集合容器来存储 集合的特点: ...
- C++的STL
今天,看一段代码的时候发现只一句话就做了个排序,是这样的: sort(rotateArray.begin(),rotateArray.end()); 很震惊,后来查了一下sort的用法, sort函数 ...
- STL---总结
文章转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/22/2603525.html 一.STL的六大组件 容器(Container),是一种 ...
- STL--迭代器(iterator)
指针与数组 指针与其它数据结构呢?比如说链表? 存储空间是非连续的.不能通过对指向这种数据结构的指针做累加来遍历. 能不能提供一个行为类似指针的类,来对非数组的数据结构进行遍历呢?这样我们就能够以同样 ...
- STL序列式容器
1.vector 空间运用的灵活性. 实现技术——关键是对大小的控制以及重新配置时的数据移动效率. 配置新空间.数据移动.释还旧空间 erase(int pos ...
随机推荐
- linux根目录下各文件的作用
各文件详列: /bin 存放常用命令的目录(二进制可执行命令) /dev 设备特殊文件 /etc 存放配置相关的文件(系统管理和配置文件) /etc/rc.d 启动的配置文件和脚 ...
- 使用Raphael 画图(一) 基本图形 (javascript)
Raphael是什么? Raphael 是一个用于在网页中绘制矢量图形的 Javascript 库.它使用 SVG W3C 推荐标准和 VML 作为创建图形的基础,你可以通过 JavaScript 操 ...
- Android LinearLayout中weight属性的意义与使用方式
layout_weight 分割父级容器的比例
- SharePoint 获取Lookup 字段的值
获取某个List里的Lookup字段的值是很普遍的事,那么我们将它封装起来 获取Lookup字段值的方法: /// <summary> /// To get lookup field Id ...
- (转载)50个c/c++源代码网站
C/C++是最主要的编程语言.这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码.这份清单提供了源代码的链接以及它们的小说明.我已 尽力包括最佳的C/C++源代码的网站.这不是一个完整的 ...
- [BZOJ 1257] [CQOI2007] 余数之和sum 【数学】
题目链接:BZOJ - 1257 题目分析 首先, a % b = a - (a/b) * b,那么答案就是 sigma(k % i) = n * k - sigma(k / i) * i ( ...
- c++ explicit
C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类 ...
- Linux Shell编程(5)——shell特殊字符(下)
{}代码块[花括号]. 这个结构也是一组命令代码块,事实上,它是匿名的函数.然而与一个函数所不同的,在代码块里的变量仍然能被脚本后面的代码访问. bash$ { local a; a=123 ...
- POJ 2594 Treasure Exploration(带交叉路的最小路径覆盖)
题意: 派机器人去火星寻宝,给出一个无环的有向图,机器人可以降落在任何一个点上,再沿着路去其他点探索,我们的任务是计算至少派多少机器人就可以访问到所有的点.有的点可以重复去. 输入数据: 首先是n和 ...
- 【转】ConcurrentModificationException异常解决办法 --不错
原文网址:http://blog.sina.com.cn/s/blog_465bcfba01000ds7.html 1月30日java.util.ConcurrentModificationExcep ...