Créer un array dans une fonction

Eléphant du PHP | 83 Messages

28 févr. 2009, 21:32

Bonjour,

J'ai une fonction qui donne la liste des sous-répertoires d'un répertoire. Je souhaite stocker cette liste dans un tableau (chaque valeur correspond à un sous-répertoire) mais je n'y arrive pas. Qu'est-ce qui ne va pas dans ce script svp ?
<?
function scanRecursif($rep){
	$dir = scandir($rep);

	 if($dir){

		 foreach($dir as $f){

			 if(is_dir($rep.$f) && $f!=".." && $f!="." ){
				 $fileList.= array($rep.$f);



				 $new_dir=realpath($rep.$f);
				 $fileList .= scanRecursif("$new_dir/");

		 }

	 }
 }
 return $fileList;


 }
$baseDir="/home/"; ///////////////////////// nom du répertoire à scanner
$arborescence  = scanRecursif($baseDir);
print_r($arborescence);

?>
Merci de m'aider car je suis dessus depuis plusieurs soirs :(

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 févr. 2009, 22:34

L'opérateur .= est un opérateur de concaténation de chaines.

Pour ajouter des éléments à un tableau, regarde du côté de la fonction array_push() :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 83 Messages

28 févr. 2009, 23:20

L'opérateur .= est un opérateur de concaténation de chaines.

Pour ajouter des éléments à un tableau, regarde du côté de la fonction array_push() :)

Bonsoir Ryle,

Franchement, j'essaye j'essaye mais je n'y arrive pas. Peux-tu m'en dire un peu plus stp car je bloque et en plus, j'ai l'impression de gacher un nombre considérable de soirée :-( :-(

Ca serait vraiment très sympa de ta part.

//////////////////// édition de ce post

HaAAAAAAAAA.... ça commence à marcher... youhouuu !! :boire9: Dès que je termine je publie le code...

///////////////////////: nouvelle édition

Bon, voilà où j'en suis :

Code : Tout sélectionner

<? function scanRecursif($rep){ $dir = scandir($rep); if($dir){ $out=array(); foreach($dir as $f){ if(is_dir($rep.$f) && $f!=".." && $f!="." ){ $fileList= "$rep$f"; array_push($out, $fileList); $new_dir=realpath($rep.$f); $fileLis = scanRecursif("$new_dir/"); } } } return $out; } $baseDir="/home/www/"; ///////////////////////// nom du répertoire à scanner $arborescence = scanRecursif($baseDir); print_r($out); ?>
Là, je ne sais pas aller plus loin car après, je fais n'importe quoi sans comprendre. Je réussis à alimenter un tableau avec array_push. Cependant :

-j'obtiens plusieurs tableaux et non 1 seul
-je n'arrive pas à en faire un print_r en dehors de la fonction.

Je pourrai y arriver, mais au bout de plusieurs jours mais surtout, sans comprendre ce que je fais. Est-ce que quelqu'un veut bien m'aider, à y arriver, mais surtout à comprendre comment ça fonctionne svp ?[/code]

ViPHP
ViPHP | 4039 Messages

01 mars 2009, 10:50

Il faut d'abord le rende lisible, le code, et utiliser les balises
 pour le colorer un peu.

[php]function scanRecursif($rep)			// fonction scanRecursif
	{   
	$dir = scandir($rep);

	if ($dir)						// sinon quoi ? On retourne une variable $out qui n'existe pas ?
		{
		$out=array();

		foreach($dir as $f)
			{
			if (is_dir($rep.$f) && $f!=".." && $f!="." )
				{
				$fileList= "$rep$f";		// c'est moche ça. Mieux vaut l'écrire comme quelques lignes plus bas.
				array_push($out, $fileList);
				$new_dir=realpath($rep.$f);
				$fileLis = scanRecursif("$new_dir/");		// c'est quoi $fileLis ??
				}
			}
		}
		return $out;
	}


$baseDir="/home/www/"; ///////////////////////// nom du répertoire à scanner
$arborescence  = scanRecursif($baseDir);
print_r($out); 	//  et en quoi $out existerait en dehors de la fonction ?
;
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 83 Messages

01 mars 2009, 11:51

Bonjour Berzemus et merci de m'aider.

Alors j'ai suivi ton conseil et voici mon code php :
<?

function scanRecursif($rep)            // fonction scanRecursif
    {   
    $dir = scandir($rep);

   $out=array();             ////////// création du tableau $out à remplir par la suite avec array_push() --- j'ai compris pourquoi $out était à une mauvaise place alors je le place ici maintenant.

    if ($dir)                      
        {
     
        foreach($dir as $f)
            {
            if (is_dir($rep.$f) && $f!=".." && $f!="." )
                {
                
                $sousrep= "$rep$f";   ////////////: liste les 1ers sous-répertoires du répertoire scanné     
                $new_dir=realpath($rep.$f); 
                $soussousrep= scanRecursif("$new_dir/");        ////// liste tous les sous-répertoires des sous-répertoires du répertoire scanné.

		
                array_push($out, $sousrep); //// on ajoute les sous-répertoires dans le tableau $out
      		array_push($out, $sousousrep);  //////on ajoute tous les sous-répertoires des sous-répertoires du répertoire scanné

                }
            }
        }
        return $out;

    }


$baseDir="/home/www/"; ///////////////////////// nom du répertoire à scanner
$arborescence  = scanRecursif($baseDir); /////////: application de la fonction sur le répertoire à scanner
print_r($out);     //  (et en quoi $out existerait en dehors de la fonction ?) comme test pour voir si ma fonction fonctionne. Mon but est d'utiliser les valeurs du tableau $out pour qu'elles soient utilisées par la suite.



?>
Si je place un print_r($out); à l'intérieur de la fonction, j'ai bien des tableaux créés.

Cependant, je n'obtiens rien en faisant un print_r($out) en dehors de la fonction pour vérifier que le tableau a bien été créé :-(

ViPHP
ViPHP | 4039 Messages

01 mars 2009, 12:24

Cependant, je n'obtiens rien en faisant un print_r($out) en dehors de la fonction pour vérifier que le tableau a bien été créé
Mais parce que $out existe à l'intérieur de la fonction. Il n'existe pas en dehors.

La fonction renvoie comme résultat le contenu de la variable $out.
function test () 
   {
   $a = 5;
   echo $a;  // affiche '5'
   return $a;
   }

echo test(); // affiche '5' 
echo $a; // ne peut pas fonctionner, $a n'existe pas en dehors de la fonction.
$b = test();
echo $b; // affiche '5'
;
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 83 Messages

01 mars 2009, 13:39

Cependant, je n'obtiens rien en faisant un print_r($out) en dehors de la fonction pour vérifier que le tableau a bien été créé
Mais parce que $out existe à l'intérieur de la fonction. Il n'existe pas en dehors.

La fonction renvoie comme résultat le contenu de la variable $out.
function test () 
   {
   $a = 5;
   echo $a;  // affiche '5'
   return $a;
   }

echo test(); // affiche '5' 
echo $a; // ne peut pas fonctionner, $a n'existe pas en dehors de la fonction.
$b = test();
echo $b; // affiche '5'
;
Merci pour cette explication, c'est très très clair !!!

J'ai modifié mon code et j'ai bien mon tableau qui s'affiche quand j'appelle la fonction YAHOUU !!.

J'ai un tout dernier problème : pour scanner les sous-rep, la fonction s'appelle elle-même ce qui fait que mon tableau $out contient des sous-tableaux alors que je ne voudrais en avoir qu'un seul avec chaque valeur correspondant à l'emplacement des répertoires.

Peux-tu m'aider stp ?
<?

function scanRecursif($rep)            // fonction scanRecursif
    {   
   $out=array(); 
    $dir = scandir($rep);

    if ($dir)                      
        {
     
        foreach($dir as $f)
            {
            if (is_dir($rep.$f) && $f!=".." && $f!="." )
                {
                
                $sousrep= "$rep$f";   ////////////: liste les 1ers sous-répertoires du répertoire scanné     
                $new_dir=realpath($rep.$f); 
                $soussousrep= scanRecursif("$new_dir/");        ////// ça doit déconner ici à mon avis car des nouveaux tableaux sont générés à l'intérieur de $out.


                array_push($out, $sousrep); //// on ajoute les sous-répertoires dans le tableau $out
      		array_push($out, $soussousrep);  //////on ajoute tous les sous-répertoires des sous-répertoires du répertoire scanné

                }

            }


        }

        return $out;

    }


$baseDir="/home/www/"; ///////////////////////// nom du répertoire à scanner
$arborescence  = scanRecursif($baseDir); /////////: application de la fonction sur le répertoire à scanner
print_r($arborescence); ////////: me donne des sous-tableaux dans mon tableau :(

ViPHP
ViPHP | 4039 Messages

01 mars 2009, 13:49

hmm.. je vois pas trop ce que tu veux.. tu peux décrire un exemple de ce à quoi tu voudrais aboutir ?

Tu voudrais uniquement scanner les répertoires d'un répertoire sans lister les sous-répertoires ? ça revient à enlever le côté récursif de ta fonction, donc il suffit de l'empêcher de s'appeler lui-même.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 83 Messages

01 mars 2009, 14:13

hmm.. je vois pas trop ce que tu veux.. tu peux décrire un exemple de ce à quoi tu voudrais aboutir ?

Tu voudrais uniquement scanner les répertoires d'un répertoire sans lister les sous-répertoires ? ça revient à enlever le côté récursif de ta fonction, donc il suffit de l'empêcher de s'appeler lui-même.
Si si, je voudrais avoir la liste des sous-rép également, mais pas dans des sous-tableaux. Pour l'instant j'ai ça :

Code : Tout sélectionner

Array ( [0] => /home/www/1 [1] => Array ( [0] => /home/www/1/TTTTTTTTTTTTt [1] => Array ( [0] => /home/www/1/TTTTTTTTTTTTt/E [1] => Array ( ) [2] => /home/www/1/TTTTTTTTTTTTt/Z [3] => Array ( ) ) ) [2] => /home/www/2 [3] => Array ( ) [4] => /home/www/test [5] => Array ( ) )
Alors que je voudrais avoir quelque chose comme ça :

Code : Tout sélectionner

Array ( [0] => /home/www/1 [1] => /home/www/1/TTTTTTTTTTTTt [2] => /home/www/1/TTTTTTTTTTTTt/E [3] => /home/www/1/TTTTTTTTTTTTt/Z [4] => /home/www/2 [5] => /home/www/test )
C'est possible tu penses ?[/code]

ViPHP
ViPHP | 4039 Messages

01 mars 2009, 19:21

En fait, ça ne déconne pas, pour le moment la fonction fait exactement ce qu'on lui demande.

Je me demande ce qui se passerait si tu utiliserait array_merge() plutôt que array_push(), regarde dans la doc de php pour voir ce qu'il en est et comment l'utiliser.

Array_merge va joindre deux tableaux, plutôt que d'insérer un tableau dans un autre. Ca m'a l'air d'être ce que tu recherches.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 83 Messages

01 mars 2009, 19:44

En fait, ça ne déconne pas, pour le moment la fonction fait exactement ce qu'on lui demande.

Je me demande ce qui se passerait si tu utiliserait array_merge() plutôt que array_push(), regarde dans la doc de php pour voir ce qu'il en est et comment l'utiliser.

Array_merge va joindre deux tableaux, plutôt que d'insérer un tableau dans un autre. Ca m'a l'air d'être ce que tu recherches.

ALELOUIA !!
<?

function scanRecursif($rep)            // fonction scanRecursif
    {   
   $out=array(); 
    $dir = scandir($rep);

    if ($dir)                      
        {
     
        foreach($dir as $f)
            {
            if (is_dir($rep.$f) && $f!=".." && $f!="." )
                {
                
                $sousrep= "$rep$f";   ////////////: liste les 1ers sous-répertoires du répertoire scanné     
                $new_dir=realpath($rep.$f); 
                $soussousrep= scanRecursif("$new_dir/");        ////// liste tous les sous-répertoires des sous-répertoires du répertoires.


                array_push($out, $sousrep); //// on ajoute les sous-répertoires dans le tableau $out
      		$out=array_merge($out, $soussousrep);  //////on ajoute tous les sous-répertoires des sous-répertoires du répertoire scanné




                }

            }


        }

        return $out;

    }


$baseDir="/home/www/"; ///////////////////////// nom du répertoire à scanner
$arborescence  = scanRecursif($baseDir); /////////: application de la fonction sur le répertoire à scanner
print_r($arborescence);

CA MARCHE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :tir2:

Bon bah, un très grand grand grand merci car mon problème est résolu. Cette fonction me permet maintenant d'avoir un tableau unidimensionnel !! Merci merci merci !! =D> :pouce: