Page 1 sur 2

lister des dossiers et sous dossiers

Posté : 21 oct. 2005, 11:38
par fred6012
Hello
Je bosse sur un script pour une galerie d'image, l'idee générale et que l'on upload les dossiers avec les photos et via l'admin, un enregistrement pour chaque photos est inséré dans la bdd.

Donc:
- je liste les dossiers
- on choisis le dossier à traiter et on a une page qui liste les photos qui s'y trouve
- on choisis les photos à inserer et on les enregistre dans la bdd.

Jusque là, ca fonctionne.

Là ou je coince, c'est pour les sous-dossiers, voir des dossiers de niveau inferieur.

Donc, pour pallier à ca, je veux lister tout mes dossiers, sous dossiers, sous sous dossiers etc mais je n'y parvient pas...

J'ai tenté le Listage recursif mais je n'arrive pas à avoir une "sortie" exploitable.

J'aurai souhaité avoir quelquechose du genre:
$aaa='dossier';
$bbb='dossier/sousdossier';
$ccc='dosser/sousdossier2';
$ddd='dossier/sousdossier/soussousdossier';
$eee='dossier2';
etc
etc

ainsi avec ces variables , je peux gerer dossier par dossier les operations suivantes.

Si vous avez l'astuce qui me manque,Merci d'avance :)

Posté : 21 oct. 2005, 11:44
par zeus
pourquoi est-ce que tu veux stocker les chemins ?
Et si tu faisait ton traitement DANS la fonction récursive ? ;)
Tu n'aurais pas à stocker de chemin et tu ne parcours qu'une fois la liste des dossiers ...

Posté : 21 oct. 2005, 11:44
par goeb
salut,
est-ce que tu utilises opendir et readdir ?
si oui, il suffit de les utiliser aussi pour les sous-dossiers.

Posté : 21 oct. 2005, 11:46
par pitt
Comment est construite ta base de données?
Peux tu à l'intérieur de celle ci voir quel est le dossier parent pour un dossier précis?

Posté : 21 oct. 2005, 11:59
par fred6012
pourquoi est-ce que tu veux stocker les chemins ?
Et si tu faisait ton traitement DANS la fonction récursive ? ;)
Tu n'aurais pas à stocker de chemin et tu ne parcours qu'une fois la liste des dossiers ...
Je préférerai utiliser la fonction qui liste les chemin independament, le traitement pouvant etre different selon certains cas
salut,
est-ce que tu utilises opendir et readdir ?
si oui, il suffit de les utiliser aussi pour les sous-dossiers.
Oui et ce n'est pas le fait de les parcourir qui pose probleme, j'arrive à les lister avec un echo dans la fonction, la ou je coince, c'est pour les ressortir dans un tableau ou autre.
Comment est construite ta base de données?
Peux tu à l'intérieur de celle ci voir quel est le dossier parent pour un dossier précis?
Non, enfin pas vraiment :)
la base de donnee servira pour l'affichage final de la galerie afin de laisser toute liberté.
par exemple un dossier xxx/zzz pourrait etre affiché comme sous categorie d'un dossier aaa/
Meme si cet exemple est poussé à l'extreme, c'est pour imager la flexibilité du systeme ;)
Dans ma bdd, une categorie(ou sous categorie) sera attribué à chaque dossier

J'espere me faire comprendre :)

Posté : 21 oct. 2005, 12:05
par zeus
Si tu veux faire une mémorisation récursive, tu peut éventuellement utiliser un tableau de tableau dans ta fonction récursive

exemple

Code : Tout sélectionner

array( [dossier 1] => array( [sousdossier 1] => "" [sousdossier 2] => ""); [dossier 2] => "");
correspondrait à l'orborescence suivante

Code : Tout sélectionner

__dossier 1 | |_sousdossier 1 | |_sousdossier 2 |_dossier 2
Et ensuite, tu parcours ton tableau, les index contenant le nom des dossiers et les valeurs contenant un tableaux du même type

Posté : 21 oct. 2005, 12:20
par fred6012
et on ne peux pas lister tout dans le meme tableau "simple".
Car la seule chose qui m'interesse est de recuperer le chemin, sans faire de distinction entre dossier, sous dossier etc...

Voici le code qui liste tout ca:
<?php 

function liste_recursive($dossier_a_parcourir)
	{
		$dir = opendir($dossier_a_parcourir) ; // on ouvre le dossier
			while( $file = readdir($dir) ) // le temps qu'il y a des dossiers
			{
					if(!is_file($dossier_a_parcourir.'/'.$file) && $file != '.' && $file != '..')
						{
							liste_recursive($dossier_a_parcourir.'/'.$file);
						}
			}
    	echo $dossier_a_parcourir.'<br>';

    } 

liste_recursive('Photos')
	
?>
qui m'affiche ceci:
Photos/vacances/amis
Photos/vacances/chambre
Photos/vacances/hotel
Photos/vacances/rando
Photos/vacances/ski/sous sous dossier
Photos/vacances/ski
Photos/vacances
Photos/à classer
Photos

Posté : 21 oct. 2005, 13:02
par zeus
OK, je comprend ton problème

Pour la réponse, il s'agit d'une question de logique :
- tu as fait une fonction qui AFFICHE les chemins. Cette fonction marche correctement
- tu voudrais placer ces chemins dans un tableau

Et si tu remplacais la ligne qui affiche par un ajout dans un tableau ? ;)

Il te suffit de passer le tableau en parametre pour assurer le recursivité et d'utiliser array_push pour ajouter à la fin de ton tableau

Posté : 22 oct. 2005, 00:01
par fred6012
Merci, en effet, pour l'insertion dans l'array, ca colle bien :D

Maintenant, je cale sur la recursivité. :oops:

Je bloque totalement pour la recursion et le passage de l'array en parametre
J'ai mit le $listedossier en global sans trop etre sur de moi :roll:

Voici le code actuel.
<?php 

$racine='Photos';

function liste_recursive($dossier_a_parcourir)
	{
		global $listedossier;
		
		$dir = opendir($dossier_a_parcourir) ; 
		$listedossier=array();
			while( $file = readdir($dir) )
				{
						if((is_dir($dossier_a_parcourir.'/'.$file)) && $file != '.' && $file != '..')
							{
								array_push ($listedossier, $file);
							}
				}
    }

liste_recursive($racine);

$nbelem=(count($listedossier));
echo 'nombre de valeurs dans cet array = '.$nbelem.'<br />';
		for($i=0;$i<$nbelem;$i++) 
		{
			
			echo $listedossier[$i].'<br />';
      
		}
	
?>
Une piste? :agenouille: :mrgreen:

Posté : 22 oct. 2005, 00:03
par Invité
est ce que possible de lister tous les dossiers, sous dossiers et noms de fichiers dans un site (free.fr)

Posté : 22 oct. 2005, 02:20
par fred6012
Bon, alors ca commence a sentir bon :D

Il semblerai que tout fonctionne, reste à rendre ca plus propre.

quelques question:
-est il preferable de declarer les array avant la fonction ou faut t'il mieux le faire à l'interieur(si elle n'existe pas dejà biensur)
-Les global sont t'il utilisé à bon escient?
<?php 

$racine='Photos';
$listechemin=array();
$listedossier=array();

function liste_recursive($dossier_a_parcourir)
	{
		global $listechemin,$listedossier;
		
		$dir = opendir($dossier_a_parcourir) ; 

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

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.'] = '.$listechemin[$i].'<br />';
			
			echo '$listedossier['.$i.'] = '.$listedossier[$i].'<hr />';
		}
	
?>

Posté : 22 oct. 2005, 09:19
par Cyrano
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.

Posté : 22 oct. 2005, 10:06
par fred6012
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:

Posté : 22 oct. 2005, 10:25
par Cyrano
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 />';
}
?>

Posté : 22 oct. 2005, 14:30
par fred6012
merci, en effet, ca a l'air plus "souple" comme ca :)