php iterator 实现
PHP Iterator 实现
在 PHP 中,Iterator 是一种接口,允许对象被用于 foreach 循环。实现 Iterator 接口需要定义五个方法:current(), key(), next(), rewind(), 和 valid()。
基本 Iterator 实现
以下是一个简单的 Iterator 实现示例,用于遍历数组:

class MyIterator implements Iterator {
private $array = [];
private $position = 0;
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
实现后,可以通过 foreach 循环遍历对象:
$iterator = new MyIterator(['apple', 'banana', 'cherry']);
foreach ($iterator as $key => $value) {
echo "$key: $value\n";
}
IteratorAggregate 实现
对于更复杂的场景,可以使用 IteratorAggregate 接口,它只需要实现一个方法 getIterator():

class MyCollection implements IteratorAggregate {
private $items = [];
public function addItem($item) {
$this->items[] = $item;
}
public function getIterator() {
return new ArrayIterator($this->items);
}
}
$collection = new MyCollection();
$collection->addItem('apple');
$collection->addItem('banana');
foreach ($collection as $item) {
echo $item . "\n";
}
自定义迭代逻辑
可以通过实现 Iterator 接口来自定义迭代逻辑,例如过滤或转换数据:
class FilterIterator implements Iterator {
private $array;
private $position = 0;
private $filter;
public function __construct(array $array, callable $filter) {
$this->array = array_values($array);
$this->filter = $filter;
}
public function rewind() {
$this->position = 0;
}
public function current() {
return ($this->filter)($this->array[$this->position]);
}
public function key() {
return $this->position;
}
public function next() {
++$this->position;
}
public function valid() {
return isset($this->array[$this->position]);
}
}
$numbers = [1, 2, 3, 4];
$filtered = new FilterIterator($numbers, function($n) { return $n * 2; });
foreach ($filtered as $value) {
echo $value . "\n"; // 输出 2, 4, 6, 8
}
内置迭代器类
PHP 提供了多种内置的迭代器类,例如:
ArrayIterator: 用于遍历数组。FilterIterator: 用于过滤数据。LimitIterator: 用于限制遍历范围。
$array = new ArrayIterator([1, 2, 3, 4]);
$filtered = new CallbackFilterIterator($array, function($value) {
return $value % 2 == 0;
});
foreach ($filtered as $value) {
echo $value . "\n"; // 输出 2, 4
}
通过实现 Iterator 接口或使用内置迭代器类,可以灵活地控制对象的遍历行为。






