lister des dossiers et sous dossiers

Eléphant du PHP | 55 Messages

22 oct. 2005, 23:10

C'est remoi :)

Désolé de revenir à la charge mais dans ma $liste, je n'ai que les 19 dossier mais les 5 sous-dossiers ne sont pas listé, l'array compte 19 valeurs mais la boucle est éxécutée 24 fois elle (je compte les "a" de l'echo, methode de teuteu mais ca marche :p)...

revoilà le code:
<?php
function liste_recursive($dossier_a_parcourir)
{
    $liste = array("listechemin" => array(), "listedossier" => array());

    $dir  =  opendir($dossier_a_parcourir) ;

    while( $file  =  readdir($dir) )
    {
        if((is_dir($dossier_a_parcourir.'/'.$file)) && $file !=  '.' && $file !=  '..')
        {
            $path = $dossier_a_parcourir.'/'.$file;
            $liste['listechemin'][] = $path;
            $liste['listedossier'][] = $file;
            liste_recursive($path);
			// un echo pour voir le nombre de passage dans la boucle
			echo 'a<br />';
        }
    }
    return $liste;
}

$racine  =  'Photos';
$liste = liste_recursive($racine);

/* Ne pas tenir compte de cette partie, elle n'est utile qu'au developement */
echo '<br />';
$nbelem = (count($liste['listedossier']));
echo 'nombre de valeurs dans cet array  =  '.$nbelem.'<br /><br />';
for($i = 0;$i<$nbelem;$i++)
{
    echo '$listechemin['.$i.']  =  '.$liste['listechemin'][$i].'<br />';
    //echo '$listedossier['.$i.']  =  '.$liste['listedossier'][$i].'<br />';
}


?>
j'ai beau avoir refait le script plusieurs fois, je ne trouve pas, pourtant, je suis sur que c'est un truc bete :oops:

questions subsidaire, j'aimerai attribuer un "niveau" au dossier selon l'arborescence (racine=0, dossier=1, sous-dossier=2 etc etc), comment puis je proceder?

Merci d'avance et désolé de la perte de temps:D

Mammouth du PHP | 1311 Messages

22 oct. 2005, 23:17

salut
essay de faire un print_r($liste) et regarde le source

Eléphant du PHP | 55 Messages

22 oct. 2005, 23:24

ce me met mes 19 dossiers (et biensur les 19 chemin)

la meme chose que le code sous la ligne de commentaires donc

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

23 oct. 2005, 00:37

ça s'appel la magie de la récursivité :x

ajoute ces lignes de test (juste avant ton echo "a")pour suivre le déroulement de ton tableau, tu vera que le nombre de données du tableau est hasardeux:
foreach ($liste['listedossier'] as $val)
			{
			echo "val = ".$val."<br>";
			}
			echo "<hr>";
Tu as en quelque sorte plusieurs tableau $liste en cours. La fonction suit un chemin dossier dans dossier jusqu'a ce qu'il y ai plus de sous-dossier puis "remonte" dans le chemin pour reparcourir un autre chemin et ecrase les donnée.

de plus tu crée un nouveau tableau a chaque passage dans la fonction enfaissant:
$liste = array("listechemin" => array(), "listedossier" => array());
dans la fonction !! a mettre en dehors de cell-ci ! et donc ajouter un paramètre de fonction.

autre chose: a chaque appel récursif de la fonction tu ne l'affecte pas au résuktat précédent. Il faut donc toujours faire comme ceci:
$liste=liste_recursive($path);

voila la solution:

function liste_recursive($dossier_a_parcourir,$liste)
{
    

    $dir  =  opendir($dossier_a_parcourir) ;

    while( $file  =  readdir($dir) )
    {
        if((is_dir($dossier_a_parcourir.'/'.$file)) && $file !=  '.' && $file !=  '..')
        {
            $path = $dossier_a_parcourir.'/'.$file;
            $liste['listechemin'][] = $path;
            $liste['listedossier'][] = $file;
            $liste=liste_recursive($path,$liste); 
        }
    }
    return $liste;
}

$racine  =  './';
$liste = array("listechemin" => array(), "listedossier" => array());
$liste = liste_recursive($racine,$liste);
et tu devrai avoir tous les dossier [-o<
et remercier la récursivité et son utilisation tres simple :twisted:
Modifié en dernier par Truc le 30 déc. 2005, 02:06, modifié 1 fois.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 55 Messages

23 oct. 2005, 01:00

ajoute ces lignes de test (juste avant ton echo "a")pour suivre le déroulement de ton tableau, tu vera que le nombre de données du tableau est hasardeux:
En effet, c'est le grand nimporte quoi :shock:
Je pensais que ca allait s'ajouter gentiment en fin de tableau ](*,)
utiliser array_push comme l'avait suggéré zeus au debut du topic aurait évité ce probleme?

de plus tu crée un nouveau tableau a chaque passage dans la fonction enfaissant:
$liste = array("listechemin" => array(), "listedossier" => array());
dans la fonction !! a mettre en dehors de cell-ci ! et donc ajouter un paramètre de fonction.
Exact et j'y ai pensé il y a quelques minutes, je l'avait passé en global, c'etait une bonne ou mauvaise idée?:-k
autre chose: a chaque appel récursif de la fonction tu ne l'affecte pas au résuktat précédent. Il faut donc toujours faire comme ceci:
$liste=liste_recursive($path);
je tombe de plus en plus bas en comprenant les boulettes que j'ai fait :oops:
et remercier la récursivité et son utilisation tres simple
Ce qui est presque rassurant c'est que ca n'a pas l'air si simple

Maintenant, tout à l'air ok :pouce: :D =D>

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

23 oct. 2005, 01:11

utiliser array_push comme l'avait suggéré zeus au debut du topic aurait évité ce probleme?
Non tu aurai eu exactement le meme probleme étant donné que array_push() fait la meme chose que $tab[]="val";
Exact et j'y ai pensé il y a quelques minutes, je l'avait passé en global, c'etait une bonne ou mauvaise idée?:-k
Mauvaise idée puisque ça marche sans le faire et tant qu'il est possible d'éviter des variables globales autant le faire :wink:

N'oubli pas le [Résolu]
et un de plus pour mon quota :lol:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 55 Messages

23 oct. 2005, 01:21

Ok, merci pour toute ton aide, ainsi qu'aux autres :)

Aller, résolu (pour ton quota :))

Je vais jeter un oeil pour definir le niveau ou on se trouve dans l'arborescence, je reposte quand j'aurai fini de pas trouver :langue:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

23 oct. 2005, 02:07

Comme j'ai été prétentieux avec cette histoire dde quota :x et que je n'avais pas fait attention a ta question subsidiaire...
questions subsidaire, j'aimerai attribuer un "niveau" au dossier selon l'arborescence (racine=0, dossier=1, sous-dossier=2 etc etc), comment puis je proceder?
j'ai trouve une possibilité en ajoutant un 3eme tableau mais comme tu a dis
Je vais jeter un oeil pour definir le niveau ou on se trouve dans l'arborescence, je reposte quand j'aurai fini de pas trouver
je me damande si tu veut voir le résultat ou que je te guides :roll:

idices:
ajout d'un array() dans $liste
ajout d'un paramètre de fonction et c'est tout

courage :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 55 Messages

23 oct. 2005, 02:25

je me damande si tu veut voir le résultat ou que je te guides :roll:

idices:
ajout d'un array() dans $liste
ajout d'un paramètre de fonction et c'est tout

courage :wink:
J'etait venu dire que j'avais terminé et je voit que tu es encore sur le coup :D

Donc, ca semble ok et en effet, un array "listenivo" en + dans $liste et un parametre nivo dans ma fonction, j'ai juste cherché ou incrémenter la variable

voici mon code a present:
<?php
function liste_recursive($dossier_a_parcourir,$liste,$nivo)
{
    $dir  =  opendir($dossier_a_parcourir) ;
	$nivo++;
    while( $file  =  readdir($dir) )
		{
			if((is_dir($dossier_a_parcourir.'/'.$file)) && $file !=  '.' && $file !=  '..')
			{
				$path = $dossier_a_parcourir.'/'.$file;
				$liste['listechemin'][] = $path;
				$liste['listedossier'][] = $file;
				$liste['listenivo'][] = $nivo;
				$liste=liste_recursive($path,$liste,$nivo);
			}
		}
    return $liste;
}

$racine  =  'Photos';
$liste = array("listechemin" => array(), "listedossier" => array(), "listenivo" => array());
$liste = liste_recursive($racine,$liste,0);


/* Ne pas tenir compte de cette partie, elle n'est utile qu'au developement */
echo '<br />';
$nbelem = (count($liste['listedossier']));
echo 'nombre de valeurs dans cet array  =  '.$nbelem.'<br /><br />';
for($i = 0;$i<$nbelem;$i++)
{
    echo '$listenivo['.$i.']  =  '.$liste['listenivo'][$i].'<br />';
    echo '$listechemin['.$i.']  =  '.$liste['listechemin'][$i].'<br />';
    echo '$listedossier['.$i.']  =  '.$liste['listedossier'][$i].'<hr />';
}


?>
ps: nivo 0 c'est la racine, 1 c'est un dossier, 2, un sous dossier etc

Le code de test me montre que tout correspond(dossiers, chemins et niveaux)

La ou je m'interroge, c'est quand est ce que $nivo repart à 0? :-k

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

23 oct. 2005, 02:46

J'avais exactement la meme chose en stock :roll:
La ou je m'interroge, c'est quand est ce que $nivo repart à 0? :-k
Hé hé toujours la magie de la récursivité :P
Et serieusement... si la variable de niveau vaut un 0 sur tous les dossier de niveau 0 ce n'est pas qu'elle a rétrogradée de 1 à 0 ou de 2 a 0 mais que la fonction inclus un while et l'incrémentation est faite avant cela donc lors du 1er passage on boucle dans le while avec niveau=0 apres le placement dans le tableau est fait branche par branche. Il y aura donc plusieurs fonctions lancées en meme temps (enfin en gros).

J'espere ne pas avoir été trop flou :wink:

dernier point pour réorganiser le tableau suvant les niveaux tu peut faire un tri dessus:
array_multisort($liste['niveau'], SORT_ASC,$liste['listechemin'],SORT_STRING,$liste['listedossier'],SORT_STRING );

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 55 Messages

23 oct. 2005, 09:59

J'espere ne pas avoir été trop flou :wink:
Toi non, c'est la récursivité qui est flou :D

En gros, il ne faut pas trop penser de facon linéaire quand on l'utilise ](*,)