Как преобразовать итеративный псевдотип PHP в экземпляр Iterator? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть PHP-функция, которая принимает iterable, и мне нужно преобразовать ее в 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()));
        };
    } }
...