mediawiki-extensions-Echo/includes/iterator/MultipleIterator.php
James D. Forrester 8c810dff48 build: Update mediawiki/mediawiki-codesniffer to 0.7.1
Also added "composer fix" command.

Change-Id: I25cb61b3b92798f1259d1575a336e2b056d5764f
2016-12-05 15:54:30 -08:00

69 lines
1.5 KiB
PHP

<?php
/**
* Presents a list of iterators as a single stream of results
* when wrapped with the RecursiveIteratorIterator.
*
* This differs from the SPL MultipleIterator in the following ways:
* * Does not return null for non-valid child iterators
* * implements RecursiveIterator
* * Lots less features(e.g. simple!)
*/
class EchoMultipleIterator implements RecursiveIterator {
protected $active = [];
protected $children;
protected $key = 0;
public function __construct( array $children ) {
$this->children = $children;
}
public function rewind() {
$this->active = $this->children;
$this->key = 0;
foreach ( $this->active as $key => $it ) {
$it->rewind();
if ( !$it->valid() ) {
unset( $this->active[$key] );
}
}
}
public function valid() {
return (bool)$this->active;
}
public function next() {
$this->key++;
foreach ( $this->active as $key => $it ) {
$it->next();
if ( !$it->valid() ) {
unset( $this->active[$key] );
}
}
}
public function current() {
$result = [];
foreach ( $this->active as $it ) {
$result[] = $it->current();
}
return $result;
}
public function key() {
return $this->key;
}
public function hasChildren() {
return (bool)$this->active;
}
public function getChildren() {
// The NotRecursiveIterator is used rather than a RecursiveArrayIterator
// so that nested arrays dont get recursed.
return new EchoNotRecursiveIterator( new ArrayIterator( $this->current() ) );
}
}