При помощи Generator::valid() можно проверить генератор на пустоту, не обходя его целиком.



После вызова $generator->valid() функция генератора начинает выполнение и доходит либо до первого yield (тогда valid возвращает true), либо до конца (valid возвращает false). Интересно, что в первом случае на генераторе можно вызвать rewind без каких-либо последствий, так как обход ещё не начался. Во втором случае генератор закрывается и обойти его уже нельзя.



Сравните: https://3v4l.org/LL8E9 и https://3v4l.org/jni5Y.