Comme il n'y a pas d'exemple sur le site officiel j'ai réalisé ce script un peu à l'aveugle. J'aimerais connaître l'avis d'experts car bien que ce soit fonctionnel je ne suis pas certain que ce soit la meilleure façon de faire (peut-être même que je n'ai rien compris, ce que je n'espère pas
Code : Tout sélectionner
<?php
class monIterateur implements RecursiveIterator{
private
$container=[],
$key;
/**
* Iterator methods
*/
public function __construct(array $container){
$this->container = $container;
$this->key = 0;
}
public function current(){
return $this->container[$this->key];
}
public function key(){
return $this->key;
}
public function next(){
$this->key++;
}
public function rewind(){
$this->key = 0;
}
public function valid(){
return isset($this->container[$this->key]);
}
/**
* RecursiveIterator methods
*/
public function getChildren(){
return new self($this->container[$this->key]);
}
public function hasChildren(){
return is_array($this->container[$this->key]);
}
}
function iterate(RecursiveIterator $iterator):Generator{
while($iterator->valid()):
if($iterator->hasChildren()):
yield from iterate($iterator->getChildren());
else:
$tabs = str_repeat("\t", (int) substr($iterator->current(), 1, 1));
yield $tabs.$iterator->current().'<br />';
endif;
$iterator->next();
endwhile;
}
$mi = new monIterateur([
'[0]b0nj0ur',
[
'[1]hell0',
'[1]PHP',
[
'[2]tr0isième',
'[2]niv0',
'[2]tr0 dark'
],
'[1]suite'
],
'[0]...et fin'
]);
print '<pre>';
foreach(iterate($mi) as $value):
print $value;
endforeach;
print '</pre>';
/*
Résultat obtenu :
[0]b0nj0ur
[1]hell0
[1]PHP
[2]tr0isième
[2]niv0
[2]tr0 dark
[1]suite
[0]...et fin
*/