php iterator,实例学习php中Iterator迭代器

165 阅读2分钟

本节介绍php中的迭代器Iterator的具体用法。

一,最简单的迭代形式 foreach语句

1,foreach 可以用于数组, 例如:

复制代码 代码示例:

foreach (arrasarr as key=>value) { echo key.’ ‘.$value.’/n’;}

2,foreach 也可以用于对象, 例如:

复制代码 代码示例:

foreach (objasobj as property) {echo $property.’/n’;}

注意: 如果在对象之外用这条语句只能输出公有的属性,不能输出私有的和保护的属性。

二,下面通过几个例子,来帮助大家理iterator的用法。

其中DirectoryIterator,RecursiveDirectoryIterator,LimitIterator都是PHP预定义的iterator类:

例1,显示/etc/目录下的所有文件(不显示子目录下的文件):# php iterator,实例学习php中Iterator迭代器

复制代码 代码示例:

$path = new DirectoryIterator(“/etc/”);

foreach ( pathaspath as file ){

echo $file .’/n’;

}

?>

例2,显示/etc/目录下的嵌套的任意层的子目录中的所有文件(显示出目录路径):

复制代码 代码示例:

$path = new RecursiveDirectoryIterator(“/etc/”);

foreach ( pathaspath as file ){

echo $file ->getPathname().’/n’;

}

?>

例3,显示/etc/目录下的前10个文件:

复制代码 代码示例:

$path = new LimitIterator(DirectoryIterator(“/etc/”),0,10);

foreach ( pathaspath as file ){

echo $file .’/n’;

}?>

说明:在php编程中,合理应用iterator迭代,可以使代码清晰,加快编程速度。

三,下面分析下Iterator迭代器的原理

1,PHP中将实现了接口Iterator中5个方法的类都称为iterator,分别为:

current()—返回当前元素值,

key()—返回当前元素的键值,

next()—下移一个元素,

valid()—判定是否还有后续元素, 如果有, 返回true,

rewind()—移到首元素

常用的iterator有: DirectoryIterator、SimpleXMLIterator几种。

2,递归iterator是实现了接口RecursiveIterator中的hasChildren()和getChildren()方法的类,

例如以上例2中的RecursiveDirectoryIterator。

3,以上例3中显示了iterator 的链接, 即将一个iterator(可以称为源iterator)作为另一个iterator(可以称为目标iterator)的参数, 通常用于数据过滤.

常用的用于链接的iterator是FilterIterator和LimitIterator。

FilterIterator是一个抽象类, 需要实现它的accept()方法作为过滤数据的规则,

而LimitIterator是类, 用法是new LimitIterator(源iterator,起始位,个数) 用于获得指定个数的元素。

4,PHP中另提供IteratorAggregate接口, 用于将非iterator的类构造为iterator, 实际是实现该接口中的getIterator()方法.

例如:

复制代码 代码示例:

class sample implements Iterator

{

private $_items = array(1,2,3,4,5,6,7);

public function __construct() {

;//void

}

public function rewind() { reset($this->_items); }

public function current() { return current($this->_items); }

public function key() { return key($this->_items); }

public function next() { return next($this->_items); }

public function valid() { return ( $this->current() !== false ); }

}

$sa = new sample();

foreach(saassa as key => $val){

print key."=>".key . "=>" .val;

}

?>