PHP 8.3.4 Released!

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

add a note

User Contributed Notes 6 notes

up
11
php at seanmorr dot is
3 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
7 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
5 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--;
}
});
?>
up
-3
koambarun at evolution dot com
7 years ago
$append_iterator = new \AppendIterator();

$generator = ReportModel::come_generator();

foreach ($errors as $value)
{
//If first $value not empty, generator is not empty.
if(!empty($value))
{
$append_iterator->append($errors);
//break out of loop after appending.
break;
}
}
up
-5
komalbarun at gmail dot com
7 years ago
Updated code.
I could not find how to edit a note :/

Preventing segfault if empty generator.
<?php

$append_iterator
= new \AppendIterator();

$generator = ReportModel::come_generator();

// Only works if first value in generator is not empty
// useful when yielding arrays
foreach ($append_iterator as $value)
{
//If first $value not empty, generator is not empty.
if(!empty($value))
{
$append_iterator->append($errors);
//break out of loop after appending.
break;
}
}
up
-8
komalbarun at gmail dot com
7 years ago
Updated code.
I could not find how to edit a note :/

Preventing segfault if empty generator.
<?php

$append_iterator
= new \AppendIterator();

$generator = some_generator();

// Only works if first value in generator is not empty
// useful when yielding arrays
foreach ($generator as $value)
{
//If first $value not empty, generator is not empty.
if(!empty($value))
{
$append_iterator->append($generator );
//break out of loop after appending.
break;
}
}
To Top