update page now

The AppendIterator class

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

Introduction

An Iterator that iterates over several iterators one after the other.

Class synopsis

class AppendIterator extends IteratorIterator {
/* Methods */
public __construct ()
public append (Iterator $iterator): void
public current (): mixed
public getIteratorIndex (): ? int
public key (): scalar
public next (): void
public rewind (): void
public valid (): bool
/* Inherited methods */
}

Table of Contents

Found A Problem?

Learn How To Improve This PageSubmit a Pull RequestReport a Bug
+add a note

User Contributed Notes 3 notes

up
11
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:
<?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
up
9
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/YC68k
https://bugs.php.net/bug.php?id=71436 
up
0
frode at ennerd dot com
7 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--;
 }
});
?>
+add a note

AltStyle によって変換されたページ (->オリジナル) /