您的位置:首页 > 理论基础 > 数据结构算法

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?

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来使用迭代器,下面整理了一下代码:

viewsource

print?

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
print
$key
.
"=>"

.
$val
;
19
}
20
?>
while循环也可以:

viewsource

print?

1
<?php
2
while
(
$itertor
->valid()){
//判断是不是最后元素
3
$element
=
$itertor
->current();
//获取当前元素
4
$itertor
->next();
//移动到下一个元素
5
}
6
?>
为什么要学习PHP的迭代器呢?有个很重要的原因:利用PHP的迭代器可以利用面向对象实现常见的数据结构,例如列表,堆栈,队列与图。后面会做一个专题,用PHP实现大部分的数据结构,而且以面向对象的形式。所以这里先预热了一下PHP的迭代器。

延伸阅读

此文章所在专题列表如下:

看看PHP迭代器的内部执行过程

用PHP迭代器来实现一个斐波纳契数列

PHPSPL,被遗落的宝石

PHP数据结构预热:PHP的迭代器

PHPPredefinedInterfaces预定义接口

本文地址:/article/1305947.html,欢迎访问原出处。

我喜欢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: