我有一个使用iterable
的PHP函数,我需要将其转换为Iterator
实例。
以下表达式对我有用,但我想知道是否有更简单的方法:
$iterator = is_array($collection)
? new ArrayIterator($collection)
: ($collection instanceof IteratorAggregate
? $collection->getIterator()
: $collection);
上下文和我不能使用foreach的原因是我的函数是一个返回闭包的生成器,我需要在闭包中进行迭代。
以下是上下文中的代码:
public static function chunkGenerator(iterable $collection, callable $chunkPredicate) {
$iterator = is_array($collection)
? new ArrayIterator($collection)
: ($collection instanceof IteratorAggregate
? $collection->getIterator()
: $collection);
assert($iterator instanceof Iterator);
while ($iterator->valid()) {
yield function () use ($iterator, $chunkPredicate) {
do {
yield $previous = $iterator->current();
$iterator->next();
} while ($iterator->valid() && $chunkPredicate($previous, $iterator->current(), $iterator->key()));
};
} }