<?php
class IncrementIterator implements Iterator {
protected $start;
protected $end;
protected $current;
public function __construct($start, $end) {
$this->start = $start;
$this->end = $end;
}
public function rewind() {
$this->current = $this->start;
}
public function valid() {
return $this->current <= $this->end;
}
public function key() {
return $this->current;
}
public function current() {
return $this->current;
}
public function next() {
$this->current++;
}
}
class NestedIterator implements Iterator {
protected $iterators = array();
protected $lastIndex = -1;
protected $iteration = 0;
public function addIterator(Iterator $it) {
$this->iterators[] = $it;
$this->lastIndex++;
}
public function rewind() {
foreach ($this->iterators as $it) {
$it->rewind();
}
$this->iteration = 0;
}
public function valid() {
return $this->lastIndex >= 0 && $this->iterators[0]->valid();
}
public function key() {
return $this->iteration;
}
public function current() {
$return = array();
foreach ($this->iterators as $it) {
$return[] = $it->current();
}
return $return;
}
public function next() {
$this->iteration++;
var_dump($this->lastIndex);exit;
for ($i = $this->lastIndex; $i >= 0; $i--) {
$this->iterators[$i]->next();
if (!$this->iterators[$i]->valid()) {
continue;
}
for ($j = $i + 1; $j <= $this->lastIndex; $j++) {
$this->iterators[$j]->rewind();
}
}
}
}
$nestedIterator = new NestedIterator();
$nestedIterator->addIterator(new IncrementIterator(0, 26));
$nestedIterator->addIterator(new IncrementIterator(0, 26));
$nestedIterator->addIterator(new IncrementIterator(0, 26));
$nestedIterator->addIterator(new IncrementIterator(0, 26));
foreach ($nestedIterator as $key => $current) {
list($a, $b, $c, $d) = $current;
echo "[$key] => $a, $b, $c, $d\n";
}
preferences:
76.43 ms | 402 KiB | 5 Q