Класс AppendIterator

(PHP 5 >= 5.1.0, PHP 7)

Введение

Итератор, который выполняет несколько других итераторов один за другим

Обзор классов

AppendIterator extends IteratorIterator implements OuterIterator {
/* Методы */
public __construct ( void )
public void append ( Iterator $iterator )
public mixed current ( void )
public void getArrayIterator ( void )
public Iterator getInnerIterator ( void )
public int getIteratorIndex ( void )
public scalar key ( void )
public void next ( void )
public void rewind ( void )
public bool valid ( void )
/* Наследуемые методы */
public mixed IteratorIterator::current ( void )
public Traversable IteratorIterator::getInnerIterator ( void )
public scalar IteratorIterator::key ( void )
public void IteratorIterator::next ( void )
public void IteratorIterator::rewind ( void )
public bool IteratorIterator::valid ( void )
}

Содержание

Коментарии

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
2016-06-15 16:56:59
http://php5.kiev.ua/manual/ru/class.appenditerator.html
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--;
    }
});
?>
2018-09-06 11:22:59
http://php5.kiev.ua/manual/ru/class.appenditerator.html
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
2020-03-26 00:18:39
http://php5.kiev.ua/manual/ru/class.appenditerator.html

    Поддержать сайт на родительском проекте КГБ