listage recusif de dossier

aelurus
Invité n'ayant pas de compte PHPfrance

26 juin 2006, 21:27

Bonjour tous
Je viens a vous car je planche sur un script php qui me permet jusque la un retour a peu pres correct du contenu d'un dossier avec ces fichiers sous dossiers et sous fichiers jusqu'a plusiueres sous niveau :).
Ba ou est le probleme me direz vous :)
Mon soucis est que je ne dois pas saisir toutes les subtilitées du script car je bloque au portage de ce script pour l'integrer dans une page a sessions donc de mettre un tableau a mon schmilblique. Le bout de code qui m'a permit de faire sa viens de nexen.
[code]
<html>
  <?php
function listage($path) {
    $O = dir($path);
    if(!is_object($O)) return false;
    while($file = $O -> read()) {
        if($file != '.' && $file != '..') {
		if(is_dir($path.'/'.$file)){
                echo "<ul>\n<B><u>".htmlentities($path).'/'.$file."</b></u>\n";
		$b[$a]=$file;echo$b;//........................
                 listage($path.'/'.$file);
               }
            else
                echo"<li>";
               if(is_file($path.'/'.$file))
                echo "".htmlentities($file)."";
		$b[$a]=$file;echo$b;
         } 
echo"</li>\n";
        }$a++;
	$O -> close();
	echo"</ul>";
	return true;
    }
  ?>
  <?php
$chemin="...";
 echo "<ul><B><u>".$chemin."</b></u>\n";
listage($chemin);
echo"</ul>";	
  //asort($liste);
  print_r($b);//pourquoi lui ne marche pas :'(
  ?>
</html>
Je suis debutant en php et solicite une aide à la compréhension de mon soucis toutes expliquations sera la bienvenue.
merci

Eléphant du PHP | 74 Messages

27 juin 2006, 00:34

pour l'intégrer dans une page avec sessions tu garde déja la fonction listage ;)

En fait il te suffit juste de "tester" la session avant d'appeler la fonction de listage ... je sais plus comment on fait pour tester s'il y'a une session mais le script doit ressembler a ça :
<html> 
  <?php 
function listage($path) { 
    $O = dir($path); 
    if(!is_object($O)) return false; 
    while($file = $O -> read()) { 
        if($file != '.' && $file != '..') { 
        if(is_dir($path.'/'.$file)){ 
                echo "<ul>\n<B><u>".htmlentities($path).'/'.$file."</b></u>\n"; 
        $b[$a]=$file;echo$b;//........................ 
                 listage($path.'/'.$file); 
               } 
            else 
                echo"<li>"; 
               if(is_file($path.'/'.$file)) 
                echo "".htmlentities($file).""; 
        $b[$a]=$file;echo$b; 
         } 
echo"</li>\n"; 
        }$a++; 
    $O -> close(); 
    echo"</ul>"; 
    return true; 
    } 
  ?> 
  <?php 
//test de session
si session = ok {
     $chemin="..."; 
     echo "<ul><B><u>".$chemin."</b></u>\n"; 
     listage($chemin); 
     echo"</ul>";
    //asort($liste); 
    print_r($b);//pourquoi lui ne marche pas :'( <-- $b est un tableau faut le parcourir avec une boucle, regarde bien dans la fonction listage comment est utilisé $b ;)
}
?> 
</html>

aelurus
Invité n'ayant pas de compte PHPfrance

27 juin 2006, 09:04

Oui c du genre
if (isset($session)){ .......

mais mon gros soucis est de passer mes echo par un tri par ordre alphabetique ou numerique via sort()
mais pour cela je dois arriver a recuperer un $tableau[]=$file;
ou alors je le met mal enfin merci je creuse :)

Eléphant du PHP | 74 Messages

27 juin 2006, 11:27

ton tableau de fichier c'est le $b
regarde bien :)
et $a a le nombre de case de ce tableau

tu doit parcourir de 0 à $a ton tableau ($b)

pour le sort.. dsl je peux pas t'aider :?

aelurus
Invité n'ayant pas de compte PHPfrance

27 juin 2006, 13:09

Oui tu as tout a fait raison mon tableau c $b
ce que je ne m'explique pas c'est pourquoi le print_r($b) ne retourne rien
Alors que
$b[$a]=$file;echo$b;//........................ 
lui me retourne array [1]......
a chaque tour de boucle, et je n'arrive pas a traiter ce fameux $b enfin de cycle d'un dossier pour avoir un affichage trié de $file.
Je creuse toujours :) merci de participer a mon tunel ^^

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 juin 2006, 14:40

avant de creuser ton tunnel dans le noir total essaye de comprendre les bases d'abord de la programmation procédurale comme ça tu auras quelques lanternes qui t'éclaireront le chemin :

Ton code se compose de 2 parties distinctes :
1. le code principal qui sera exécuté en 1° niveau
2. le code de la fonction "listage" qui n'est exécuté qu'à l'appel à partir du code principal

Le code principal utilise sa propre mémoire de données (variables globales) dont la durée de vie est celle du programme principal

Le code de la fonction lui aussi dispose de sa propre mémoire de données qui ne sera créée que l'orsque la fonction sera appellée (variables locales)

Il n'y a pas de relation entre une variable globale et une variable locale même si deux variables ont le même nom.

Les variables locales à une fonction disparaissent de la mémoire dès que la fonction qui les a créées disparait (se termine)

Par contre une fonction peut voir et accèder directement à une variable globale du programme principal sans passage de paramètres à la condition sous php d'utiliser la directive "global" dans la fonstion pour désigner la liste des variables globales à utiliser.

Exemple :
<?php
//Code principal
//déclarer 2 variables globales du principal
$var_globale1 = 1;
$var_globale2 = 2;

//appel de la fonction
modifier_var_globale1(); //cette fonction n'utilise pas la directive "global" pour accéder à la variable globale => elle ne peut pas y accèder

//Afficher les variables globales (après le passage de la fonction)
echo $var_globale1; //le passage de la fonction n'a aucun effet sur cette variable globale

//appel de la fonction
modifier_var_globale2(); //fonction accèdant à une variable globale

//Afficher les variables globales (après le passage de la fonction)
echo $var_globale2; //cette variable globale a été modifiée par la fonction

//Afficher les variables locales d'une fonction 
créer_var_locale1(); //cette fonction crée ses propres variables locales
echo $var_locale1; //appel incorrect à une variable locale qui n'existe plus

//Les fonctions utilisées
function modifier_var_globale1(){
   $var_globale1 = "modifiée"; //cette variable est concidérée locale même si son nom ressemble à une variable globale (dù à l'absence de la directive "global")
}
function modifier_var_globale2(){
  global $var_globale2;    //directive "global" permettant à la fonction d'accéder à une ou plusieurs variables globales
  $var_globale2 = "modifiée";
}
function créer_var_locale1(){
   $var_locale1 = 1; //variable locale
}
?>
Conclusion:
tes variables $b se trouvant dans le code principal est une variable globale différente de $b qui se trouve en local dans la fonction "listage"

Correction suggérée :
  • Soit tu utilise la directive "global $b;" au niveau de la fonction pour qu'elle accéde directement à la variable globale $b du principal

    Soit tu fais un "return $b;" à la fin de la fonction pour qu'elle retourne la valeur de la variable locale $b dans la variable globale $b du principal en écrivant l'appel comme ça:
$b = listage($chemin); 

ps:
un programme php qui fait explorateur de fichiers (FAQ) : http://www.phpfrance.com/forums/voir_re ... php#133555
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

aelurus
Invité n'ayant pas de compte PHPfrance

28 juin 2006, 13:17

Effectivement :)
Je te remercie de cette réponse tres explicite. Je comprend mieux mes soucis a récuperer un tableau.
J'ai simplifié la chose avec une passage via l'url de mes deux variable path et fichier, solution temporaire...
Car je veux une transparence dans l'url avec une session puis je voudrais que les fichiers listés , enfin le retour , soit trié... :)
Ayant bonne espoire je continue :)

aelurus
Invité n'ayant pas de compte PHPfrance

28 juin 2006, 13:21

Le but de ce script est de generer un menu a plusieurs niveau :)

aelurus
Invité n'ayant pas de compte PHPfrance

28 juin 2006, 14:28

Mais mais mais
à lire et à relire ta réponse ....
le coup de
$b=listage($chemin);
une variable qui a pour valeur une fonction ....
c un concept et une structure qui .... me fait penser à la POO ?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

28 juin 2006, 16:25

Non, c'est juste un concept de fonction qui retourne une valeur.

Une fonction, contrairement à une procédure effectue un traitement en vue de retourner le résultat (une valeur ou une liste de valeurs)

Exemple 1:
function somme ($a, $b) {
   return ($a + $b); //cette fonction retourne à l'appelant la somme de a et b
}

//Appel de la fonction dans le programme principal
$s = somme (1, 2);
echo $s; //ceci affiche 3
Exemple 2:
function trier ($liste_à_trier) {
 return sort($liste_à_trier); //retourne le tableau trié
}
//Appel de la fonction de tri
$alphabet = array ("z", "b", "c", "a");
$alphabet_triée = trier ($alphabet); 
print_r ($alphabet_triée); //ceci affiche le tableau : ('a', 'b', 'c', 'z')
Exemple 3:
function existe ($élément, $liste) {
  return  ($élément && is_array($liste) && in_array($élément, $liste)?true:false);
  //retourne vrai si élément existe dans une liste valide
}
//Appel de la fonction existe
$liste = array (1, 2, 3, 5, 10);

if ( existe (2, $liste) ) echo "2 existe"; else echo "2 n'existe pas"; //ceci affiche 2 existe

if ( existe (4, $liste) ) echo "4 existe"; else echo "4 n'existe pas"; //ceci affiche 4 n'existe pas
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

aelurus
Invité n'ayant pas de compte PHPfrance

30 juin 2006, 14:47

Des réponse toujours aussi précises je vois :)
Puis effectivement avec le systheme de fonction qui s'auto appel ton histoire de globale me parait inévitable car ma varible pour le tableau ce vide a chaque boucle appelant cette meme fonction, :'(
cela dit je vais mettre un peu de coté cette histoire de triage car mine de rien le tableau a generer c'est quand meme un peu pas évident je vais deja me concentrer sur le retour html puis ensuite envisager de faire le chilblique en plusieure fonction.
Car la c un peut trop geek ^^, donc sa sera une fonction de triage une fonction de lecture de dossier une autre pour les fichiers et peut etre une general pour tout faire tourner :)
En tout cas merci :)