pcrov/iteratorstackiterator

遍历迭代器堆,丢弃已完成的迭代器。

1.0.2 2016-09-17 10:50 UTC

This package is auto-updated.

Last update: 2024-09-21 21:01:39 UTC


README

Build Status Coverage Status License Latest Stable Version

遍历迭代器堆,丢弃已完成的迭代器。

需求

PHP 7,需要安装 Ds 扩展 或其 polyfill。当通过 composer 安装 IteratorStackIterator 时,php-ds polyfill 将自动安装,并且仅在 Ds 扩展未安装或未启用时加载。

安装

使用 composer 安装

composer require pcrov/iteratorstackiterator

用法

此迭代器实现了 OuterIterator,分别添加了 push()pop() 方法来添加和删除内部迭代器。

push() 将返回堆的新大小。 pop() 将返回从顶部弹出的迭代器。

key()current() 返回的值始终来自堆顶迭代器的当前位置。

next() 将堆顶迭代器的游标向前移动。如果该迭代器不再有效,它将被删除,以及任何其他已完成的迭代器,直到找到有效的迭代器或堆为空。

rewind() 将将堆上留下的所有迭代器重置。

示例 1

$stack = new \pcrov\IteratorStackIterator();
$stack->push(
    new ArrayIterator([1, 2, 3]),
    new ArrayIterator([4, 5, 6]),
    new ArrayIterator([7, 8, 9])
);

foreach ($stack as $value) {
    echo $value;
}

// output: 789456123

可以在迭代已经开始后向堆中添加迭代器。它们在添加时 不会 自动重置,因此如果需要,您应该在它们上调用 rewind()

示例 2

$stack = new \pcrov\IteratorStackIterator();
$stack->push(
    new ArrayIterator([1, 2, 3]),
    new ArrayIterator([4, 5, 6])
);
$stack->rewind();

while ($stack->valid()) {
    $value = $stack->current();
    echo $value;
    $stack->next();

    if ($value === 2) {
        $stack->push(new ArrayIterator([7, 8, 9]));
    }
}

// output: 456127893

请注意,在推送新的迭代器之前调用 next(),否则当堆回溯到该位置时将重复该位置(在这种情况下,这会导致无限循环。)

如果从堆迭代器外部操作内部迭代器的游标位置,则其行为是未定义的。