lister des dossiers et sous dossiers

Eléphant du PHP | 55 Messages

21 oct. 2005, 11:38

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 :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 oct. 2005, 11:44

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 ...
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 413 Messages

21 oct. 2005, 11:44

salut,
est-ce que tu utilises opendir et readdir ?
si oui, il suffit de les utiliser aussi pour les sous-dossiers.
--
Goeb

Eléphant du PHP | 153 Messages

21 oct. 2005, 11:46

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?

Eléphant du PHP | 55 Messages

21 oct. 2005, 11:59

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 :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 oct. 2005, 12:05

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 55 Messages

21 oct. 2005, 12:20

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 oct. 2005, 13:02

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 55 Messages

22 oct. 2005, 00:01

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:
Modifié en dernier par fred6012 le 22 oct. 2005, 02:14, modifié 1 fois.

Invité
Invité n'ayant pas de compte PHPfrance

22 oct. 2005, 00:03

est ce que possible de lister tous les dossiers, sous dossiers et noms de fichiers dans un site (free.fr)

Eléphant du PHP | 55 Messages

22 oct. 2005, 02:20

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 />';
		}
	
?>

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 55 Messages

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:

Mammouth du PHP | 19672 Messages

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 />';
}
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 55 Messages

22 oct. 2005, 14:30

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