PHP数据结构预热:PHP的迭代器
2013-02-26 20:29
316 查看
迭代器有时又称光标(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。
举几个迭代器的使用范围:
使用返回迭代器的包或库时(如PHP5中的SPL迭代器)
无法在一次的调用获取容器的所有元素时
要处理数量巨大的无素时(数据库中的表以GB计的数据)
……
不同的迭代器有不同的接口,例如PHPSPL迭代器中包括Next()(移动到下一个元素),corrent()(返回当前元素),valid()(检查迭代结尾),rewind()(从头重新开始),key()(返回当前元素的索引)。当然你可以自己写适合自己用的迭代器,也可以用系统中的迭代器。
一般是使用foreach来使用迭代器,下面整理了一下代码:
while循环也可以:
为什么要学习PHP的迭代器呢?有个很重要的原因:利用PHP的迭代器可以利用面向对象实现常见的数据结构,例如列表,堆栈,队列与图。后面会做一个专题,用PHP实现大部分的数据结构,而且以面向对象的形式。所以这里先预热了一下PHP的迭代器。
各种语言实作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 sample implements Iterator{ |
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 sample implements Iterator |
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的迭代器
- PHP常用算法和数据结构示例
- Php SPL库中的迭代器接口详解
- php实现的基本数据结构
- 递归遍历多维数组(树数据结构)的超级简单方式,并且可以递归超过200层,摘自<<PHP精粹:编写高效PHP代码>>
- PHP基础之生成器4——比较生成器和迭代器对象
- 【数据结构】PHP实现查找表
- 数据结构――排序(php代码实现)
- PHP迭代器实现斐波纳契数列的函数
- php迭代器的基本例子
- PHP实现栈(Stack)数据结构
- 用PHP迭代器来实现一个斐波纳契数列
- JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用
- PHP设计模式系列 - 迭代器