当前位置:首页 > PHP

php iterator 实现

2026-01-29 15:33:02PHP

实现 PHP Iterator 接口

在 PHP 中,可以通过实现 Iterator 接口来创建自定义的可迭代对象。Iterator 接口定义了以下方法:

Iterator extends Traversable {
    public current(): mixed
    public key(): mixed
    public next(): void
    public rewind(): void
    public valid(): bool
}

基本实现示例

创建一个简单的迭代器类,遍历一个数组:

php 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]);
    }
}

使用自定义迭代器

$data = ['apple', 'banana', 'cherry'];
$iterator = new MyIterator($data);

foreach ($iterator as $key => $value) {
    echo "Key: $key, Value: $value\n";
}

实现 Generator 的替代方案

PHP 5.5+ 提供了生成器(Generator)作为更简单的迭代器实现方式:

php iterator 实现

function myGenerator(array $array) {
    foreach ($array as $key => $value) {
        yield $key => $value;
    }
}

$data = ['apple', 'banana', 'cherry'];
foreach (myGenerator($data) as $key => $value) {
    echo "Key: $key, Value: $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";
}

实现 SeekableIterator 接口

如果需要随机访问功能,可以实现 SeekableIterator 接口:

class MySeekableIterator implements SeekableIterator {
    private $array = [];
    private $position = 0;

    public function __construct(array $array) {
        $this->array = $array;
    }

    public function seek($position) {
        if (!isset($this->array[$position])) {
            throw new OutOfBoundsException("Invalid position ($position)");
        }
        $this->position = $position;
    }

    // 实现其他 Iterator 方法...
}

注意事项

  • 迭代器对象在遍历后不会自动重置,需要手动调用 rewind() 或重新创建实例
  • 生成器函数只能使用一次,遍历完成后需要重新调用生成器函数
  • 对于大型数据集,生成器可以节省内存,因为它们不需要一次性加载所有数据

标签: phpiterator
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…