Skip to content

不同于 Iterator 接口,IteratorAggregate 接口只提供了一个 getIterator 方法,它的返回值是一个 Iterator 迭代的对象,主要适用于需要将遍历和数据分离的处理情况。

IteratorAggregate 迭代器的基本使用

以下是基本的迭代器使用示例

php
class AIteratorIteratorAggregate implements IteratorAggregate
{
    private $data;

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

    public function getIterator(): Traversable
    {
        return new ArrayIterator($this->data);
    }
}

class Demo
{
    public $property1 = "Public property one";
    public $property2 = "Public property two";
    public $property3 = "Public property three";
    private $property5 = "private property five";

    public function __construct()
    {
        $this->property4 = "last property";
    }
}

$AIterator = new AIteratorIteratorAggregate((new Demo()));
foreach ($AIterator as $key => $item) {
    var_dump($key, $item);
}

迭代结果:
string(9) "property1"
string(19) "Public property one"
string(9) "property2"
string(19) "Public property two"
string(9) "property3"
string(21) "Public property three"
string(9) "property4"
string(13) "last property"

从上边的迭代结果可以看出,聚合迭代器可以迭代类的公有属性,但是对于类的私有属性却无法迭代。聚合迭代器通常结合 spl 的一些内置迭代器进行工作,他们包括:

常用的 spl 迭代器

下边是一些常用迭代器的列表,具体的使用将在后续的文章中介绍,这里仅作一个简单的介绍

迭代器简介
AppendIterator连续迭代其他迭代器的迭代器
ArrayIterator数组迭代器
CachingIterator对另一个对象的缓存进行迭代
CallbackFilterIterator回调迭代器,在迭代时使用函数过滤
DirectoryIterator目录文件遍历迭代器
EmptyIterator返回一个空的迭代器,当返回对象必须是迭代器类型时可以使用
FilesystemIterator文件系统迭代器
FilterIterator数据过滤迭代器
GlobIterator
InfiniteIterator持续迭代器,一次迭代结束后,会再次从开始位置从新迭代
IteratorIterator通用的迭代器,所有实现了 Traversable 接口的迭代器都可以被迭代
LimitIterator返回给定数量的结果以及从集合中取出结果的起始索引点
MultipleIterator顺序迭代迭代器的连接器
NoRewindIterator只能迭代一次的迭代器
ParentIterator扩展的 FilterIterator 迭代器,可以过滤掉来自于 RecursiveIterator 迭代器的非父元素。
RecursiveArrayIterator创建一个用于递归形式数组结构的迭代器,类似于多维数组。
RecursiveCachingIterator在 RecursiveIterator 迭代器上执行提前读取一个元素的递归操作。
RecursiveCallbackFilterIterator在 RecursiveIterator 迭代器上进行递归操作,同时执行过滤和回调操作
RecursiveDirectoryIterator递归目录文件遍历器,可实现列出所有目录层次结构,而不是只操作一个目录
RecursiveFilterIterator是 FilterIterator 迭代器的递归形式,也要求实现抽象的 accept()方法,但在这个方法中应该使用$this->getInnerIterator()方法访问当前正在迭代的迭代器。
RecursiveIteratorIterator将一个树形结构的迭代器展开为一维结构
RecursiveRegexIterator是 RegexIterator 迭代器的递归形式,只接受 RecursiveIterator 迭代器作为迭代对象。
RecursiveTreeIterator以可视在方式显示一个树形结构
RegexIterator继承 FilterIterator,支持使用正则表达式模式匹配和修改迭代器中的元素。经常用于将字符串匹配。