mirror of
https://github.com/php/php-src.git
synced 2024-10-08 10:16:12 +00:00
159c538bcf
- Remove all overloading hooks -> array_read/array_access must be rewritten - Remove all basic iterators - Remove all 'spl_' prefixing exposed to user level - Add RecursiveIterator, RecursiveIteratorIterator - Add DirectoryIterator, DirectoryTreeIterator - Add some examples
87 lines
1.7 KiB
PHP
Executable File
87 lines
1.7 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* @brief Iterates through recursive iterators
|
|
* @author Marcus Boerger
|
|
* @version 1.0
|
|
*
|
|
*/
|
|
class RecursiveIteratorIterator implements Iterator
|
|
{
|
|
protected $ait = array();
|
|
protected $count = 0;
|
|
|
|
function __construct(RecursiveIterator $it) {
|
|
$this->count = 1;
|
|
$this->ait[0] = $it;
|
|
}
|
|
|
|
|
|
function rewind() {
|
|
while ($this->count > 1) {
|
|
unset($this->ait[--$this->count]);
|
|
}
|
|
$this->ait[0]->rewind();
|
|
$this->ait[0]->recursed = false;
|
|
}
|
|
|
|
function hasMore() {
|
|
$count = $this->count;
|
|
while ($count--) {
|
|
$it = $this->ait[$count];
|
|
if ($it->hasMore()) {// || (!$it->recursed && $it->isRecursive())) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function key() {
|
|
$it = $this->ait[$this->count-1];
|
|
return $it->key();
|
|
}
|
|
|
|
function current() {
|
|
$it = $this->ait[$this->count-1];
|
|
return $it->current();
|
|
}
|
|
|
|
function next() {
|
|
while ($this->count) {
|
|
$it = $this->ait[$this->count-1];
|
|
if ($it->hasMore()) {
|
|
if (!$it->recursed && $it->hasChildren()) {
|
|
$it->recursed = true;
|
|
$sub = $it->getChildren();
|
|
$sub->recursed = false;
|
|
$sub->rewind();
|
|
if ($sub->hasMore()) {
|
|
$this->ait[$this->count++] = $sub;
|
|
if (!is_a($sub, 'RecursiveIterator')) {
|
|
throw new Exception(get_class($sub).'::getChildren() must return an object that implements RecursiveIterator');
|
|
}
|
|
return;
|
|
}
|
|
unset($sub);
|
|
}
|
|
$it->next();
|
|
$it->recursed = false;
|
|
if ($it->hasMore()) {
|
|
return;
|
|
}
|
|
$it->recursed = false;
|
|
}
|
|
if ($this->count <= 1) {
|
|
return;
|
|
}
|
|
unset($this->ait[--$this->count]);
|
|
$it = $this->ait[$this->count-1];
|
|
}
|
|
}
|
|
|
|
function getCurrentIterator() {
|
|
return $this->ait[$this->count-1];
|
|
}
|
|
}
|
|
|
|
?>
|