У меня есть 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()));
};
} }