ait[0] = $it; } /** Rewind to top iterator as set in constructor */ function rewind() { while ($this->count) { unset($this->ait[$this->count--]); $this->endChildren(); } $this->ait[0]->rewind(); $this->ait[0]->recursed = false; } /** @return whether iterator is valid */ function valid() { $count = $this->count; while ($count) { $it = $this->ait[$count]; if ($it->valid()) { return true; } $count--; $this->endChildren(); } return false; } /** @return current key */ function key() { $it = $this->ait[$this->count]; return $it->key(); } /** @return current element */ function current() { $it = $this->ait[$this->count]; return $it->current(); } /** Forward to next element */ function next() { while ($this->count) { $it = $this->ait[$this->count]; if ($it->valid()) { if (!$it->recursed && callHasChildren()) { $it->recursed = true; $sub = callGetChildren(); $sub->recursed = false; $sub->rewind(); if ($sub->valid()) { $this->ait[++$this->count] = $sub; if (!$sub instanceof RecursiveIterator) { throw new Exception(get_class($sub).'::getChildren() must return an object that implements RecursiveIterator'); } $this->beginChildren(); return; } unset($sub); } $it->next(); $it->recursed = false; if ($it->valid()) { return; } $it->recursed = false; } if ($this->count) { unset($this->ait[$this->count--]); $it = $this->ait[$this->count]; $this->endChildren(); } } } /** @return Sub Iterator at given level or if unspecified the current sub * Iterator */ function getSubIterator($level = NULL) { if (is_null($level)) { $level = $this->count; } return @$this->ait[$level]; } /** * @return The inner iterator */ function getInnerIterator() { return $this->it; } /** @return Current Depth (Number of parents) */ function getDepth() { return $this->level; } /** @return whether current sub iterators current element has children * @since PHP 5.1 */ function callHasChildren() { return $this->ait[$this->count]->hasChildren(); } /** @return current sub iterators current children * @since PHP 5.1 */ function callGetChildren() { return $this->ait[$this->count]->getChildren(); } /** Called right after calling getChildren() * @since PHP 5.1 */ function beginChildren() { } /** Called after current child iterator is invalid * @since PHP 5.1 */ function endChildren() { } } ?>