par
tesmet » 24 avr. 2018, 22:41
Hello. C'est peut-être suffisant si le code est fonctionnel et que tu le maitrises ?
Pour moi yield est une classe pseudo-Iterator (Generator) qui n'a probablement pas été pensée pour être mixée avec de véritables *Iterator* mais plutôt pour faire simple et rapide et depuis PHP7 on a en effet yield from qui permet de faire du récursif en pseudo-Iterator.
function iterate_recursive($array) {
foreach($array as $value) {
if(is_array($value)) yield from iterate_recursive($value); // PHP7
else yield $value;
}
}
$array = ['[0]b0nj0ur',['[1]hell0','[1]PHP',['[2]tr0isième','[2]niv0','[2]tr0 dark'],'[1]suite'],'[0]...et fin0'];
echo '<pre>';
foreach(iterate_recursive($array) as $value) {
echo str_repeat("\t", $value{1}), "$value\n";
}
echo '</pre>';
Il y a aussi des classes PHP qui implémentent les interfaces *Iterator* et la classe RecursiveArrayIterator est à peu près identique à ta classe monIterateur. Si le but est d'émuler la fonction array_walk_recursive() en OO pour foreach() avec RecursiveArrayIterator, alors il faut lui adjoindre la classe RecursiveIteratorIterator.
$array = ['[0]b0nj0ur',['[1]hell0','[1]PHP',['[2]tr0isième','[2]niv0','[2]tr0 dark'],'[1]suite'],'[0]...et fin0'];
echo '<pre>';
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $value) {
echo str_repeat("\t", $value{1}), "$value\n";
}
echo '</pre>';
J'espère ne pas être trop à coté du sujet.
// identation automatique selon un pseudo-Iterator récursif
function tableau_recursif($tableau, $marge = 0) {
foreach($tableau as $valeur) {
if(is_array($valeur)) {
$marge++;
yield from tableau_recursif($valeur, $marge); // PHP7
$marge--;
}
else (yield $marge => $valeur);
}
}
$tableau = ['b0nj0ur',['hell0','PHP',['tr0isième','niv0','tr0 dark'],'suite'],'...et fin0'];
echo '<pre>';
foreach(tableau_recursif($tableau) as $marge => $valeur) {
echo str_repeat("\t", $marge), "[$marge]$valeur\n";
}
echo '<hr>';
// extraire en OO via une orgie de *Iterator* les fichiers PHP
// du répertoire parent ainsi que tous les sous-répertoires
class RecursiveFilterFilesPHP extends RecursiveFilterIterator {
public function accept() {
return
$this->hasChildren() ||
strtolower(pathinfo($this->current(), PATHINFO_EXTENSION)) == 'php';
}
}
$my_PHP_files = new RecursiveFilterFilesPHP(new RecursiveDirectoryIterator('../'));
foreach(new RecursiveIteratorIterator($my_PHP_files) as $value) {
echo "$value\n";
}
echo '</pre>';
Hello. C'est peut-être suffisant si le code est fonctionnel et que tu le maitrises ?
Pour moi yield est une classe pseudo-Iterator (Generator) qui n'a probablement pas été pensée pour être mixée avec de véritables *Iterator* mais plutôt pour faire simple et rapide et depuis PHP7 on a en effet yield from qui permet de faire du récursif en pseudo-Iterator.
[PHP]function iterate_recursive($array) {
foreach($array as $value) {
if(is_array($value)) yield from iterate_recursive($value); // PHP7
else yield $value;
}
}
$array = ['[0]b0nj0ur',['[1]hell0','[1]PHP',['[2]tr0isième','[2]niv0','[2]tr0 dark'],'[1]suite'],'[0]...et fin0'];
echo '<pre>';
foreach(iterate_recursive($array) as $value) {
echo str_repeat("\t", $value{1}), "$value\n";
}
echo '</pre>';[/PHP]
Il y a aussi des classes PHP qui implémentent les interfaces *Iterator* et la classe RecursiveArrayIterator est à peu près identique à ta classe monIterateur. Si le but est d'émuler la fonction array_walk_recursive() en OO pour foreach() avec RecursiveArrayIterator, alors il faut lui adjoindre la classe RecursiveIteratorIterator.
[PHP]$array = ['[0]b0nj0ur',['[1]hell0','[1]PHP',['[2]tr0isième','[2]niv0','[2]tr0 dark'],'[1]suite'],'[0]...et fin0'];
echo '<pre>';
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $value) {
echo str_repeat("\t", $value{1}), "$value\n";
}
echo '</pre>';[/PHP]
J'espère ne pas être trop à coté du sujet.
[PHP]// identation automatique selon un pseudo-Iterator récursif
function tableau_recursif($tableau, $marge = 0) {
foreach($tableau as $valeur) {
if(is_array($valeur)) {
$marge++;
yield from tableau_recursif($valeur, $marge); // PHP7
$marge--;
}
else (yield $marge => $valeur);
}
}
$tableau = ['b0nj0ur',['hell0','PHP',['tr0isième','niv0','tr0 dark'],'suite'],'...et fin0'];
echo '<pre>';
foreach(tableau_recursif($tableau) as $marge => $valeur) {
echo str_repeat("\t", $marge), "[$marge]$valeur\n";
}
echo '<hr>';
// extraire en OO via une orgie de *Iterator* les fichiers PHP
// du répertoire parent ainsi que tous les sous-répertoires
class RecursiveFilterFilesPHP extends RecursiveFilterIterator {
public function accept() {
return
$this->hasChildren() ||
strtolower(pathinfo($this->current(), PATHINFO_EXTENSION)) == 'php';
}
}
$my_PHP_files = new RecursiveFilterFilesPHP(new RecursiveDirectoryIterator('../'));
foreach(new RecursiveIteratorIterator($my_PHP_files) as $value) {
echo "$value\n";
}
echo '</pre>';[/PHP]