pcrov / iteratorstackiterator
遍历迭代器堆,丢弃已完成的迭代器。
1.0.2
2016-09-17 10:50 UTC
Requires
- php: ^7.0
- php-ds/php-ds: ^1
Requires (Dev)
- phpunit/phpunit: ^5.2
This package is auto-updated.
Last update: 2024-09-21 21:01:39 UTC
README
遍历迭代器堆,丢弃已完成的迭代器。
需求
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()
,否则当堆回溯到该位置时将重复该位置(在这种情况下,这会导致无限循环。)
如果从堆迭代器外部操作内部迭代器的游标位置,则其行为是未定义的。