PHP数据结构预热:PHP的迭代器
2013-03-25 13:49
288 查看
迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容。
各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java,C#,Python,Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicititerator),但像是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。
viewsource
print?
举几个迭代器的使用范围:
使用返回迭代器的包或库时(如PHP5中的SPL迭代器)
无法在一次的调用获取容器的所有元素时
要处理数量巨大的无素时(数据库中的表以GB计的数据)
……
不同的迭代器有不同的接口,例如PHPSPL迭代器中包括Next()(移动到下一个元素),corrent()(返回当前元素),valid()(检查迭代结尾),rewind()(从头重新开始),key()(返回当前元素的索引)。当然你可以自己写适合自己用的迭代器,也可以用系统中的迭代器。
一般是使用foreach来使用迭代器,下面整理了一下代码:
viewsource
print?
while循环也可以:
viewsource
print?
为什么要学习PHP的迭代器呢?有个很重要的原因:利用PHP的迭代器可以利用面向对象实现常见的数据结构,例如列表,堆栈,队列与图。后面会做一个专题,用PHP实现大部分的数据结构,而且以面向对象的形式。所以这里先预热了一下PHP的迭代器。
看看PHP迭代器的内部执行过程
用PHP迭代器来实现一个斐波纳契数列
PHPSPL,被遗落的宝石
PHP数据结构预热:PHP的迭代器
PHPPredefinedInterfaces预定义接口
本文地址:/article/1305947.html,欢迎访问原出处。
我喜欢
各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java,C#,Python,Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicititerator),但像是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。
01 | <?php |
02 |
03 | /** |
04 | *Iterator模式的简单实现类 |
05 | */ |
06 | class
implements
|
07 | private $_items ; |
08 |
09 | public function __construct(& $data ){ |
10 | $this ->_items= $data ; |
11 | } |
12 | public function current(){ |
13 | return current( $this ->_items); |
14 | } |
15 |
16 | public function next(){ |
17 | next( $this ->_items); |
18 | } |
19 |
20 | public function key(){ |
21 | return key( $this ->_items); |
22 | } |
23 |
24 | public function rewind (){ |
25 | reset( $this ->_items); |
26 | } |
27 |
28 | public function valid(){ |
29 | return ( $this ->current()!==FALSE); |
30 | } |
31 | } |
32 |
33 | /**DEMO*/ |
34 | $data
array (1,2,3,4,5); |
35 | $sa
new sample( $data ); |
36 | foreach ( $sa AS $key => $row ){ |
37 | echo $key , '' , $row , '<br/>' ; |
38 | } |
39 |
40 | ?> |
使用返回迭代器的包或库时(如PHP5中的SPL迭代器)
无法在一次的调用获取容器的所有元素时
要处理数量巨大的无素时(数据库中的表以GB计的数据)
……
不同的迭代器有不同的接口,例如PHPSPL迭代器中包括Next()(移动到下一个元素),corrent()(返回当前元素),valid()(检查迭代结尾),rewind()(从头重新开始),key()(返回当前元素的索引)。当然你可以自己写适合自己用的迭代器,也可以用系统中的迭代器。
一般是使用foreach来使用迭代器,下面整理了一下代码:
01 | <?php |
02 | class
implements
|
03 | { |
04 | private $_items = array (1,2,3,4,5,6,7); |
05 |
06 | public function __construct(){ |
07 | ; //void |
08 | } |
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);} |
14 | } |
15 |
16 | $sa
new sample(); |
17 | foreach ( $sa as $key
$val ){ |
18 | $key . "=>" . $val ; |
19 | } |
20 | ?> |
1 | <?php |
2 | while ( $itertor ->valid()){ //判断是不是最后元素 |
3 | $element = $itertor ->current(); //获取当前元素 |
4 | $itertor ->next(); //移动到下一个元素 |
5 | } |
6 | ?> |
延伸阅读
此文章所在专题列表如下:本文地址:
我喜欢
相关文章推荐
- PHP数据结构预热:PHP的迭代器
- PHP数据结构预热:PHP的迭代器
- PHP数据结构预热:PHP的迭代器
- PHP数据结构预热:PHP的迭代器
- PHP数据结构预热:PHP的迭代器(转)
- PHP数据结构预热:PHP的迭代器
- 复习(数据结构:java):线性表(数组):迭代器
- PHP数据结构之二 线性表中的顺序表的PHP实现
- 开始复习原来的数据结构了,用PHP实现
- PHP数据结构练习笔记--线性表
- php算法和数据结构
- PHP数据结构与算法:队列
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
- PHP 程序员学数据结构与算法之《栈》
- PHP代码:基本数据结构和php内置函数
- php面试题之二——数据结构和算法(高级部分)
- PHP数据结构之一:PHP数据结构基本概念—数据结构
- PHP与数据结构之循环队列
- 在网上看到使用PHP实现常见的数据结构和算法