Probleme avec une fonction recursive...

Signaler
Messages postés
105
Date d'inscription
lundi 13 décembre 2004
Statut
Membre
Dernière intervention
14 février 2013
-
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
-
bonjour, j'ai une fonction qui me liste tout les fichier, dossier, d'un
repertoire.quand elle tombe sur un dossier elle se réexecute avec celui
ci de facon a avoir tout l'arborecense fille de mon dossier.

le prbleme et quelle me renvoi la valeur de retour avant d'avoir finni
de lister tout les sous et les sousousrepertoires...ainsi que les
fichiers si trouvant.



je vous met le code parce que mon explication apres relecture ne semble pas tres claire :







$toto=getFileList('./',true);



echo "";

print_r($toto);

echo "

";



function getFileList($dir, $recurse=false)

{

# array to hold return value

$retval = array();



# add trailing slash if missing

if(substr($dir, -1) != "/") $dir .= "/";



# open pointer to directory and read list of files

$d = @dir($dir) or die("getFileList: Failed opening directory for reading");

while(false !($entry $d->read())) {

# skip hidden files

if ($entry[0] == ".") continue;

if (is_dir("$dir$entry")) {

if($recurse && is_readable("$dir$entry/")) {

$retval = array_merge($retval, getFileList("$dir$entry/"));

} else {

$retval[] = array(

"name" => "$dir$entry/",

//"type" => filetype("$dir$entry"),

"size" => 0,

"lastmod" => filemtime("$dir$entry")

);

}

} else {

$retval[] = array(

"name" => "$dir$entry",

//"type" => mime_content_type("$dir$entry"),

"size" => filesize("$dir$entry"),

"lastmod" => filemtime("$dir$entry")

);

}

}

$d->close();



return $retval;

}





comment faire pour quelle ne me les renvoi que lorsqu'elle a finni de lister tout les sous et sous

-sous repertoires?

merci d'avance

5 réponses

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,



à la place de tes $dir$entry, tu devrais écrire : $dir.$entry
Messages postés
91
Date d'inscription
samedi 30 mars 2002
Statut
Membre
Dernière intervention
11 octobre 2005

hello,

je pense avoir compris ton pb

ce que tu as besoin sont les fonctions ob_start() et ob_end_flush()

la premiere enclenche la bufferisation de sortie et la 2e afficher le buffer

tu peux mettre en place une fonction de callback sur le buffer (voir mon exemple)


si ma reponse te conviens pense a l'accepter


J'espere qu'il n'y aura pas de pb de sauts de lignes (car les \n provenant de mon linux ne sont pas interpretés comme des sauts de ligne ici)

aurelien

<?php

function callback($buffer)
{
$buffer2 = "";
$buffer2.= str_replace("{", "<li>", $buffer);
$buffer2 = str_replace("}", "</li>", $buffer2);
$buffer2.= "";
return $buffer2;
}

ob_start("callback");

for($i=0; $i<10; $i++)
{
echo "{input $i}";
}


ob_end_flush();

?>
Messages postés
91
Date d'inscription
samedi 30 mars 2002
Statut
Membre
Dernière intervention
11 octobre 2005

je tente un nouveau post avec des sauts de lignes potables
hello,
je pense avoir compris ton pb
ce que tu as besoin sont les fonctions ob_start() et ob_end_flush()
la premiere enclenche la bufferisation de sortie et la 2e afficher le buffer
tu peux mettre en place une fonction de callback sur le buffer (voir mon exemple)

si ma reponse te conviens pense a l'accepter

aurelien

<?php

function callback($buffer)
{
$buffer2 = "";
$buffer2.= str_replace("{", "<li>", $buffer);
$buffer2 = str_replace("}", "</li>", $buffer2);
$buffer2.= "";
return $buffer2;
}

ob_start("callback");

for($i=0; $i<10; $i++)
{
echo "{input $i}";
}


ob_end_flush();

?>
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Perso je ne comprends pas ton probleme.

Quand tu appelles ta ofnction récursivement, tu merges un "nouveau"
tableau et la valeur de retour. Ce, jusqu'à arrêt complet des appels
récursifs. Donc à la fin, à l'appel de ta fonction, tu dois retrouver
ton tableau complet avec tous les répertoires et sous-répertoires. Si
ce n'est pas le cas, c'est que ta fonction rrête de s'appeler
récursivement ava,nt d'avoir fini l'arborescence, et donc qu'il y a un
probleme dans ta détection des sous-répertoires, fichiers...



Voici un extrait d'un de mes programmes, tu traduiras. Cet appel fonctionne parfaitement.

<ol>
<li>

</li>
<li>public function __construct ($chemin '.<var>', $objForm, $interdits '</var><var>') { // constructeur, on initialise quelques membres.</var></li>
<li><var>

setlocale (LC_TIME,'</var>French<var>');</var></li><li><var>

if (is_array ($interdits)) {</var></li><li><var>

$this -> interdits = $interdits;</var></li><li><var>

}</var></li><li><var>

$this -> chemin = $chemin;</var></li><li><var>

$this -> objForm = $objForm;</var></li><li><var>

//$this -> tableau_dir = $this -> create_tab ($this -> chemin);</var></li><li><var>

}</var></li><li><var>

</var></li><li><var>

public function create_tab ($dir) { // methode creant le tableau contenant les repertoires et fichiers</var></li><li><var>

$dir rtrim ($dir, '</var>/<var>'); // on vire un eventuel slash mis par l'</var>utilisateur de la fonction a droite du repertoire</li><li> if (<var>is_dir</var> ($<var>dir</var>)) <samp>// si c'est un repertoire</samp></li><li> $dh <var>opendir</var> ($<var>dir</var>); <samp>// on l'ouvre</samp></li><li> else {</li><li> echo $<var>dir</var>, <var>' n\'</var>est pas un repertoire valide<var>'; // sinon on sort! Appel de fonction non valide</var></li><li><var>

exit;</var></li><li><var>

}</var></li><li><var> while
(($file = readdir ($dh)) !== false ) { //boucle pour parcourir le
repertoire </var></li><li><var>

if ($file !== '</var>.<var>' && $file !== '</var>..<var>' && !in_array ($file, $this -> interdits)) { // no comment</var></li><li><var>

$path =$dir.'</var>/<var>'.$file; // construction d'</var>un joli chemin...</li><li> if (<var>is_dir</var> ($path)) { <samp>//si on tombe sur un sous-repertoire </samp></li><li> $tableau[$<var>dir</var>][<var>'dir'</var>][] = $path;</li><li> $tabTmp
= $this -> create_tab ($path); <samp>// appel recursif pour lire a l'interieur de ce sous-repertoire</samp></li><li> if (<var>is_array</var> ($tabTmp) && <var>is_array</var> ($tableau))</li><li> $tableau
<var>array_merge</var> ($tableau, $tabTmp);</li><li> }</li><li> else</li><li> $tableau[$<var>dir</var>]['<var>file</var><var>'][] $path;</var></li><li><var>

}</var></li><li><var>

}</var></li><li><var>

closedir ($dh); // on ferme le repertoire courant</var></li><li><var>

return $tableau;</var></li><li><var>

}

</var></li>
</ol>
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
et ça n'a de toutes façons rien à voir, à priori, avec la bufferisation de sortie...