A classe AppendIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Introdução

Um Iterador que itera sobre vários iteradores um após o outro.

Resumo da classe

class AppendIterator extends IteratorIterator {
/* Métodos */
public __construct()
public append(Iterator $iterator): void
public current(): mixed
public key(): scalar
public next(): void
public rewind(): void
public valid(): bool
/* Métodos herdados */
}

Índice

adicione uma nota

Notas Enviadas por Usuários (em inglês) 3 notes

up
10
php at seanmorr dot is
5 years ago
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:<?phpfunction foo() {        foreach ([] as $foo) {                yield $foo;        }}$append = new AppendIterator();$append->append(new NoRewindIterator(foo()));var_dump(iterator_to_array($append));https://3v4l.org/pgiXB
up
8
joshdifabio at gmail dot com
9 years ago
Note that AppendIterator will segfault when iterating over an empty generator. Do not use AppendIterator in conjunction with generators.https://3v4l.org/YC68khttps://bugs.php.net/bug.php?id=71436
up
0
frode at ennerd dot com
6 years ago
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--;    }});?>
To Top