如何将PHP可迭代的伪类型转换为Iterator实例?

时间:2019-04-04 15:36:01

标签: php foreach iterator iterable

我有一个使用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()));
        };
    } }

0 个答案:

没有答案