PHPKonf 2020 Online

The RecursiveIterator interface

(PHP 5 >= 5.1.0, PHP 7)

Introduction

Classes implementing RecursiveIterator can be used to iterate over iterators recursively.

Interface synopsis

RecursiveIterator extends Iterator {
/* Methods */
public hasChildren ( ) : bool
/* Inherited methods */
abstract public Iterator::current ( ) : mixed
abstract public Iterator::key ( ) : scalar
abstract public Iterator::next ( ) : void
abstract public Iterator::rewind ( ) : void
abstract public Iterator::valid ( ) : bool
}

Table of Contents

add a note add a note

User Contributed Notes 2 notes

up
11
andresdzphp at php dot net
9 years ago
RecursiveIterator example:

<?php

class MyRecursiveIterator implements RecursiveIterator
{
    private
$_data;
    private
$_position = 0;
   
    public function
__construct(array $data) {
       
$this->_data = $data;
    }
   
    public function
valid() {
        return isset(
$this->_data[$this->_position]);
    }
   
    public function
hasChildren() {
        return
is_array($this->_data[$this->_position]);
    }
   
    public function
next() {
       
$this->_position++;
    }
   
    public function
current() {
        return
$this->_data[$this->_position];
    }
   
    public function
getChildren() {
        echo
'<pre>';
       
print_r($this->_data[$this->_position]);
        echo
'</pre>';
    }
   
    public function
rewind() {
       
$this->_position = 0;
    }
   
    public function
key() {
        return
$this->_position;
    }
}

$arr = array(0, 1, 2, 3, 4, 5 => array(10, 20, 30), 6, 7, 8, 9 => array(1, 2, 3));
$mri = new MyRecursiveIterator($arr);

foreach (
$mri as $c => $v) {
    if (
$mri->hasChildren()) {
        echo
"$c has children: <br />";
       
$mri->getChildren();
    } else {
        echo
"$v <br />";
    }

}
?>

Result:

0
1
2
3
4
5 has children:
Array
(
    [0] => 10
    [1] => 20
    [2] => 30
)
6
7
8
9 has children:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
up
0
ksours at internbrands dot com
4 years ago
Note that MyRecursiveIterator does not implement the correct return type for getChildren.  Which is why the example code doesn't make much sense.
To Top