par
xaccrocheur » 11 sept. 2008, 04:34
Voici une correction pour comparer :
Wow, Sieur Sadeq, vous m'avez steacké sur ce coup. Prendre le temps de lire mon code tout naze, puis le ré-écrire en corrigeant également les erreurs de style, puis tester tout ça sur votre serveur, non vraiment, je suis impressionné par tant de diligence, en anglais on dit "you are a gentleman and a scholar"
Me voilà avec une boucle récursive certes infiniment + élégante, mais qui me retourne toujours autant, sinon plus d'éléments : OK, les réps/sous reps se retrouvent dans $list, (par ailleurs parfaitement construite, comme je la souhaitais, merci) mais autant de fois que la boucle a trouvé de mp3s, ce qui est d'ailleurs son comportement normal.
Mais je cherche un moyen de réduire cette liste en ne gardant qu'une seule occurrence à chaque fois.
array_unique() n'est pas une option, puisqu'elle conserve les index sans les réorganiser, et la liste est inexploitable si on doit naviguer dedans (<= et =>).
En somme, mon problème, de balèze, est devenu tout petit : Quelqu'un sait-il comment réduire un array() à *une* seule occurrence à chaque fois ?
Merci encore pour votre aide
Mon code actuel :
function recursive_readdir ($myDir) {
$list = array();
// sortir si faux dossier
if (!is_dir ($myDir)) { echo $myDir .' n\'est pas un repertoire valide'; return; }
// ouvrir le dossier
$dh = opendir ($myDir);
// et parcourir son contenu
while (($file = readdir ($dh)) !== false ) {
if ($file != '.' && $file != '..' && $file != 'img' && $file != 'tmp') {
//si on tombe sur un sous-repertoire
if (is_dir ($myDir.'/'.$file)) {
$list = array_merge($list, recursive_readdir ($myDir.'/'.$file)); // appel recursif + récup list
}
else {
// On cherche si l'extention est "mp3"
$infos = pathinfo($myDir.'/'.$file);
if ($infos['extension'] == 'mp3') {
// echo '<p>Ya des mp3 dans ', $myDir, ' !</p>';
$list[] = $myDir; // Construction de la liste
}
}
}
}
closedir ($dh);
return $list;
}
// Programme principal
$list = recursive_readdir('.');
var_dump($list);
Et sa sortie :
array(37) { [0]=> string(28) "./elephant/elephant_in_paris" [1]=> string(28) "./elephant/elephant_in_paris" [2]=> string(28) "./elephant/elephant_in_paris" [3]=> string(28) "./elephant/elephant_in_paris" [4]=> string(28) "./elephant/elephant_in_paris" [5]=> string(28) "./elephant/elephant_in_paris" [6]=> string(28) "./elephant/elephant_in_paris" [7]=> string(28) "./elephant/elephant_in_paris" [8]=> string(13) "./azero/demos" [9]=> string(13) "./azero/demos" [10]=> string(22) "./azero/counternatures" [11]=> string(22) "./azero/counternatures" [12]=> string(22) "./azero/counternatures" [13]=> string(22) "./les_intouchables/now" [14]=> string(22) "./les_intouchables/now" [15]=> string(22) "./les_intouchables/now" [16]=> string(22) "./les_intouchables/now" [17]=> string(30) "./les_intouchables/demos_enfer" [18]=> string(30) "./les_intouchables/demos_enfer" [19]=> string(30) "./les_intouchables/demos_enfer" [20]=> string(30) "./les_intouchables/demos_enfer" [21]=> string(25) "./les_intouchables/touche" [22]=> string(25) "./les_intouchables/touche" [23]=> string(25) "./les_intouchables/touche" [24]=> string(25) "./les_intouchables/touche" [25]=> string(27) "./les_intouchables/tamuziga" [26]=> string(27) "./les_intouchables/tamuziga" [27]=> string(27) "./les_intouchables/tamuziga" [28]=> string(27) "./les_intouchables/tamuziga" [29]=> string(27) "./les_intouchables/tamuziga" [30]=> string(27) "./les_intouchables/tamuziga" [31]=> string(27) "./les_intouchables/tamuziga" [32]=> string(27) "./les_intouchables/tamuziga" [33]=> string(27) "./les_intouchables/tamuziga" [34]=> string(27) "./les_intouchables/tamuziga" [35]=> string(27) "./les_intouchables/tamuziga" [36]=> string(27) "./les_intouchables/tamuziga" }
EDIT bon, j'ai réglé le PB en utilisant quand même array_unique, puis en faisant une nouvelle liste :
function recursive_readdir ($myDir) {
$list = array();
if (!is_dir ($myDir)) { echo $myDir .' n\'est pas un repertoire valide'; return; }
$dh = opendir ($myDir);
while (($file = readdir ($dh)) !== false ) {
if ($file != '.' && $file != '..' && $file != 'img' && $file != 'tmp') {
if (is_dir ($myDir.'/'.$file)) { //si on tombe sur un sous-repertoire
$list = array_merge($list, recursive_readdir ($myDir.'/'.$file)); // appel recursif + récup list
}
else {
$infos = pathinfo($myDir.'/'.$file); // On cherche si l'extention est "mp3"
if ($infos['extension'] == 'mp3') {
$list[] = $myDir; // Construction de la liste
}
}
}
}
closedir ($dh);
return $list;
}
// Programme principal
$list = recursive_readdir('.');
$list = array_unique($list);
//$list = array_flip($list);
foreach ( $list as $dir ) //on parcours le tableau
{
$newlist[] = $dir; // Construction de la liste
}
print_r($newlist);
Sortie :
Array ( [0] => ./elephant/elephant_in_paris [1] => ./azero/demos [2] => ./azero/counternatures [3] => ./les_intouchables/now [4] => ./les_intouchables/demos_enfer [5] => ./les_intouchables/touche [6] => ./les_intouchables/tamuziga )
Hoooorray !!
