php实现迭代器
实现迭代器的基本步骤
在PHP中,可以通过实现Iterator接口或IteratorAggregate接口来创建自定义迭代器。以下是两种方法的详细说明。
实现Iterator接口
Iterator接口要求实现以下五个方法:
current():返回当前元素。key():返回当前元素的键。next():移动到下一个元素。rewind():重置迭代器到第一个元素。valid():检查当前位置是否有效。
示例代码:
class MyIterator implements Iterator {
private $position = 0;
private $array = [];
public function __construct(array $array) {
$this->array = $array;
$this->position = 0;
}
public function rewind() {
$this->position = 0;
}
public function current() {
return $this->array[$this->position];
}
public function key() {
return $this->position;
}
public function next() {
++$this->position;
}
public function valid() {
return isset($this->array[$this->position]);
}
}
// 使用示例
$iterator = new MyIterator(['a', 'b', 'c']);
foreach ($iterator as $key => $value) {
echo "$key: $value\n";
}
实现IteratorAggregate接口
IteratorAggregate接口只需实现一个方法getIterator(),返回一个迭代器实例。这种方式更简洁,适合将现有数据结构包装为迭代器。
示例代码:
class MyCollection implements IteratorAggregate {
private $items = [];
public function __construct(array $items) {
$this->items = $items;
}
public function getIterator() {
return new ArrayIterator($this->items);
}
}
// 使用示例
$collection = new MyCollection(['x', 'y', 'z']);
foreach ($collection as $item) {
echo "$item\n";
}
内置迭代器类
PHP提供了多个内置的迭代器类,可以直接使用或扩展:
ArrayIterator:用于遍历数组。DirectoryIterator:用于遍历目录。RecursiveIteratorIterator:用于递归遍历嵌套结构。
示例使用ArrayIterator:
$array = [1, 2, 3];
$iterator = new ArrayIterator($array);
foreach ($iterator as $value) {
echo "$value\n";
}
生成器实现迭代器
PHP 5.5+支持生成器(Generator),可以用更简单的方式实现迭代逻辑。生成器函数使用yield关键字返回值。
示例代码:

function myGenerator($start, $end) {
for ($i = $start; $i <= $end; $i++) {
yield $i;
}
}
// 使用示例
foreach (myGenerator(1, 3) as $value) {
echo "$value\n";
}
注意事项
- 实现
Iterator接口时,需确保所有方法逻辑正确,尤其是valid()和current()的边界条件。 - 使用
IteratorAggregate时,通常优先返回内置迭代器(如ArrayIterator)以减少代码量。 - 生成器适合处理大数据集或惰性计算,避免一次性加载所有数据到内存。






