Boucle récursive
Posté : 09 sept. 2008, 20:00
Bonjour ; J'ai un PB avec une fonction récursive, qui a tendance à s'exécuter une fois de trop
- Ça fait le boulot que je lui demande : Lister les répertoires contenant des fichiers mp3.
- Ça fait ce boulot une fois par niveau d'arborescence. Bon, comment n'obtenir qu'un sortie, la dernière, une fois qu'on a bien tout récursé ?)
- Print_R me sort ça [0] => ./elephant/elephant_in_paris, toujours [0] Donc en fait, il s'agit d'un tableau de tableaux contenant chacun juste une référence (0, pas 1 ? Bon) Mais j'arrive PAS à piger où se crée cette itération en trop
- J'ai bien compris qu'à chaque récursion, les valeurs étaient ré-initialisées, d'où l'utilité de les stocker dans un tableau... Mais comment utiliser le "return" correctement ? Au final, je voudrais "juste" récupérer un tableau que je pourrai "cycler" comment ça :
Répertoire précédent : $goodList[-1]
Répertoire courant : $goodList[1]
Répertoire suivant : $goodList[+1]
J'ai donc besoin d'un tableau sensiblement indentique à ce que j'ai, mais un peu différent, puisque là les clefs d'index sont les mêmes à chaque fois... Help ?
Merci de votre patience
function recursive_readdir ($dir) {
$goodList = array();
$tempList = array();
$dir = rtrim ($dir, '/'); // on vire un eventuel slash
if (is_dir ($dir)) // si c'est un repertoire
$dh = opendir ($dir);
else {
echo $dir, ' n\'est pas un repertoire valide'; // sinon on sort! Appel de fonction non valide
exit;
}
while (($file = readdir ($dh)) !== false ) {
if ($file !== '.' && $file !== '..' && $file !== 'img' && $file !== 'tmp') {
$path =$dir.'/'.$file;
if (is_dir ($path)) { //si on tombe sur un sous-repertoire
recursive_readdir ($path); // appel recursif
}
else // si il s'agit d'un fichier
$pos = strrpos($file, '.');
if($pos===false)
{ continue;
} else {
$good = substr($file, $pos+1);
}
// On cherche si l'extention est "mp3"
if ($good == 'mp3') {
// echo '<p>Ya des mp3 dans ', $dir, ' !</p>';
$tempList[] = $dir; // Construction de la liste
}
}
}
closedir ($dh);
$goodList = array_unique($tempList);
Print_R($goodList);
// return $goodList;
}
recursive_readdir('.');
Produit la sortie suivante :
... Deux fois. Observations :Array ( [0] => ./elephant/elephant_in_paris ) Array ( ) Array ( [0] => ./azero/demos ) Array ( [0] => ./azero/counternatures ) Array ( ) Array ( [0] => ./les_intouchables/now ) Array ( [0] => ./les_intouchables/demos_enfer ) Array ( [0] => ./les_intouchables/touche ) Array ( [0] => ./les_intouchables/tamuziga ) Array ( ) Array ( )
- Ça fait le boulot que je lui demande : Lister les répertoires contenant des fichiers mp3.
- Ça fait ce boulot une fois par niveau d'arborescence. Bon, comment n'obtenir qu'un sortie, la dernière, une fois qu'on a bien tout récursé ?)
- Print_R me sort ça [0] => ./elephant/elephant_in_paris, toujours [0] Donc en fait, il s'agit d'un tableau de tableaux contenant chacun juste une référence (0, pas 1 ? Bon) Mais j'arrive PAS à piger où se crée cette itération en trop
- J'ai bien compris qu'à chaque récursion, les valeurs étaient ré-initialisées, d'où l'utilité de les stocker dans un tableau... Mais comment utiliser le "return" correctement ? Au final, je voudrais "juste" récupérer un tableau que je pourrai "cycler" comment ça :
Répertoire précédent : $goodList[-1]
Répertoire courant : $goodList[1]
Répertoire suivant : $goodList[+1]
J'ai donc besoin d'un tableau sensiblement indentique à ce que j'ai, mais un peu différent, puisque là les clefs d'index sont les mêmes à chaque fois... Help ?
Merci de votre patience