lister des dossiers et sous dossiers

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : lister des dossiers et sous dossiers

Re: petit pb

par fred6012 » 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 ](*,)

Re: petit pb

par Truc » 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 );

Re: petit pb

par fred6012 » 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

Re: petit pb

par Truc » 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:

par fred6012 » 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:

par Truc » 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:

par fred6012 » 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>

par Truc » 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:

par fred6012 » 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

par jeff » 22 oct. 2005, 23:17

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

petit pb

par fred6012 » 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

par fred6012 » 22 oct. 2005, 14:30

merci, en effet, ca a l'air plus "souple" comme ca :)

par Cyrano » 22 oct. 2005, 10:25

Tu aurais une manière plus simple qui te permettrait d'utiliser cette fonction depuis n'importe où sans utiliser globals pourtant: utilise un tableau à deux dimensions:
<?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);
        }
    }
    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($listechemin));
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 />';
}
?>

par fred6012 » 22 oct. 2005, 10:06

ok, va pour le global alors, le but etant de les utiliser nimporte ou dans le script une fois les dossiers listés.

Merci à tous :love5:

par Cyrano » 22 oct. 2005, 09:19

Tu peux utiliser les deux méthodes, mais l'accès à ces variables ne sera pas le même;
- soit, comme dans ton code, tu les déclares avant la fonction et tu utilises global dans la fonction, ça permet d'accéder aux variables à l'intérieur de la fonction comme dans le reste du script.
- Tu déclares les tableaux à l'intérieur de la fonction et tu supprimes global() : dans ce cas, l'utilisation des tableaux ne pourra avoir lieu qu'à l'intérieur de la fonction et tu ne pourras pas y accéder en dehors de cette fonction.