joshdifabio is technically correct, but I don't see this as a bug. You can't rewind a generator and thats what append iterator does.
If you want to use AppendIterator with Generators just wrap them with NoRewindIterator:
<?php
function foo() {
foreach ([] as $foo) {
yield $foo;
}
}
$append = new AppendIterator();
$append->append(new NoRewindIterator(foo()));
var_dump(iterator_to_array($append));
https://3v4l.org/pgiXB
PHP.mk документација
AppendIterator
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Патека
class.appenditerator.php
Локална патека за оваа страница.
Извор
php.net/manual/en
Оригиналниот HTML се реупотребува и локално се стилизира.
Режим
Прокси + превод во позадина
Кодовите, табелите и белешките остануваат читливи во истиот тек.
Референца
class.appenditerator.php
AppendIterator
Референца за `class.appenditerator.php` со подобрена типографија и навигација.
Класата AppendIterator
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
Вовед
Итератор што итерира преку неколку итератори еден по друг.
Синопсис на класата
Содржина
- AppendIterator::append — Додава итератор
- AppendIterator::__construct — Конструира AppendIterator
- AppendIterator::current — Го добива тековната вредност
- AppendIterator::getArrayIterator — Го добива ArrayIterator
- AppendIterator::getIteratorIndex — Го добива индекс на итератори
- AppendIterator::key — Го добива тековниот клуч
- AppendIterator::next — Се преместува на следниот елемент
- AppendIterator::rewind — Премотува наназад Итераторот
- AppendIterator::valid — Проверува валидност на тековниот елемент
Белешки од корисници 3 белешки
php на seanmorr точка е ¶
пред 5 години
joshdifabio на gmail точка ком ¶
пред 9 години
Note that AppendIterator will segfault when iterating over an empty generator. Do not use AppendIterator in conjunction with generators.
https://3v4l.org/YC68k
https://bugs.php.net/bug.php?id=71436
frode на ennerd точка ком ¶
пред 7 години
In many cases, especially for streaming sources, Generators are way more efficient. I noticed that the AppendIterator buffers the entire "inner iterator".
<?php
/**
* This appends $next iterator to $iterator.
*/
function append_iterators(...$iterators){
foreach($iterators as $iterator)
foreach($iterator as $row)
yield($row);
}
/**
* Merge iterator takes one first from each iterator until
* every iterator is empty.
*/
function merge_iterators(....$its) {
$numberOfIts = sizeof($its);
while($numberOfIts > 0) {
$iterator = array_shift($its);
yield($iterator->current());
$iterator->next();
if($iterator->valid())
$its[] = $iterator;
else
$numberOfIts--;
}
});
?>