Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2011, 17h40   #1
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2011
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 39
Points : 19
Points : 19
Par défaut return NULL string

Bonjour

J'ai un probleme de return, lorsque lance ce script, celui ci m'affiche NULL
alors que si je remplace return $file[10] par echo $file[10], cela m'affiche bien ma chaine de caractere voulu, je ne comprends pas pourquoi dans le cas d'un return il m'affiche null, pouvez vous m'eclairer ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$directory = dirname(__FILE__)."/xml/111208-photos_ADF";

function lister($chemin){   
  	$nom_repertoire = $chemin;
  	$pointeur = opendir($nom_repertoire);
	while ($fichier = readdir($pointeur)){
		if(($fichier != '.') && ($fichier != '..')){
			$found=$nom_repertoire.'/'.$fichier;
			 if (is_dir($nom_repertoire.'/'.$fichier))
            		lister($nom_repertoire.'/'.$fichier);
        	else
        		if (is_file($found) && eregi(".jpg", $found))	{
					$file=explode('/', $found);
					return $file[10];
				}
			}
		}
	closedir($pointeur);
}
$doc =lister($directory);
 var_dump($doc);
soryo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 17h59   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonjour,

Je ne vois pas pourquoi echo te renverrait une donnée que return ne pourrait pas.
Ton return $file[10]; correspond à quoi ? Nom du fichier ?
Avec ton code tu cherches à faire quoi ? Récupérer le 1er fichier .jpg d'un répertoire c'est ça ?
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/12/2011, 18h06   #3
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2011
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 39
Points : 19
Points : 19
Citation:
Envoyé par rawsrc Voir le message
Bonjour,

Je ne vois pas pourquoi echo te renverrait une donnée que return ne pourrait pas.
Ton return $file[10]; correspond à quoi ? Nom du fichier, extension ?
Avec ton code tu cherches à faire quoi ? Récupérer le 1er fichier .jpg d'un répertoire c'est ça ?
Ca correspond au nom des fichier ex : 62-STIENNE-M-15173.jpg

dans le cas ou je fais un echo $file[10]:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$directory = dirname(__FILE__)."/xml/111208-photos_ADF";
 
function lister($chemin){   
  	$nom_repertoire = $chemin;
  	$pointeur = opendir($nom_repertoire);
	while ($fichier = readdir($pointeur)){
		if(($fichier != '.') && ($fichier != '..')){
			$found=$nom_repertoire.'/'.$fichier;
			 if (is_dir($nom_repertoire.'/'.$fichier))
            		lister($nom_repertoire.'/'.$fichier);
        	else
        		if (is_file($found) && eregi(".jpg", $found))	{
					$file=explode('/', $found);
					echo $file[10].'<br/>';
				}
			}
		}
	closedir($pointeur);
}
//$doc =lister($directory);
//var_dump($doc);
lister($directory);
ca m'affiche bien mon tableau et je cherche a le return :
Code :
1
2
3
4
5
6
7
8
9
62-LUBRET-J-15158.jpg
62-PICQUE-J-15168.jpg
62-BARBIER-J-15117.jpg
62-MACIEJASZ-D-15159.jpg
62-LEDENT-M-15151.jpg
62-LEROY-J-15154.jpg
62-CORBISEZ-J-15121.jpg
62-LOUF-M-15157.jpg
62-PERON-S-15164.jpg

dans le cas ou je remplace l'echo par return $file[10];
le return ne devrait pas contenir mon tableau ci dessus ?
soryo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 18h20   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 031
Points : 5 031
Ahem... Tu fais ton return en plein milieu d'une boucle toi ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 18h23   #5
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par Benjamin Delespierre Voir le message
Ahem... Tu fais ton return en plein milieu d'une boucle toi ?
Bah oui si tu veux juste récupérer le 1er élément (c'est pas la meilleure approche je te l'accorde mais ça peut le faire)
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/12/2011, 18h26   #6
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2011
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 39
Points : 19
Points : 19
Le probleme viendrai de l'emplacement de mon return ?
soryo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 18h30   #7
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
oui,
voici comment faire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function lister($chemin){
   $files = array();   
   $nom_repertoire = $chemin;
   $pointeur = opendir($nom_repertoire);
   while ($fichier = readdir($pointeur)){
      if(($fichier != '.') && ($fichier != '..')){
         $found=$nom_repertoire.'/'.$fichier;
         if (is_dir($nom_repertoire.'/'.$fichier))
            lister($nom_repertoire.'/'.$fichier);
         else
         if (is_file($found) && eregi(".jpg", $found))	{
            $file = explode('/', $found);
            $files[] = $file[10];
         }
      }
   }
   closedir($pointeur);
   return $files; // Array([] => filename)
}
Mais bon, c'est assez désuet comme approche depuis qu'il existe le RecursiveDirectoryIterator
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/12/2011, 18h41   #8
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2011
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 39
Points : 19
Points : 19
Merci pour vos reponses,

alors quand j'ai teste :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function lister($chemin){
   $files = array();   
   $nom_repertoire = $chemin;
   $pointeur = opendir($nom_repertoire);
   while ($fichier = readdir($pointeur)){
      if(($fichier != '.') && ($fichier != '..')){
         $found=$nom_repertoire.'/'.$fichier;
         if (is_dir($nom_repertoire.'/'.$fichier))
            lister($nom_repertoire.'/'.$fichier);
         else
         if (is_file($found) && eregi(".jpg", $found))	{
            $file = explode('/', $found);
            $files[] = $file[10];
         }
      }
   }
   closedir($pointeur);
   return $files; // Array([] => filename)
}
en faisant :
Code :
1
2
3
$coco = lister($directory);
foreach($coco as $element=>$coco)
	echo $element.'<br/>';
je n'ai rien qui s'affiche.

en fasant un var_dump de ma fonction a la place du foreach :
soryo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 18h51   #9
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Oui c'est du récursif donc c'est normal que t'ais rien ($files est réinitialisé à chaque appel), essaies avec ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
 
function lister($chemin, array &$files){
   $nom_repertoire = $chemin;
   $pointeur = opendir($nom_repertoire);
   while ($fichier = readdir($pointeur)){
      if(($fichier != '.') && ($fichier != '..')){
         $found=$nom_repertoire.'/'.$fichier;
         if (is_dir($nom_repertoire.'/'.$fichier))
            lister($nom_repertoire.'/'.$fichier, $files);
         else
         if (is_file($found) && eregi(".jpg", $found))   {
            $file = explode('/', $found);
            $files[] = $file[10];
         }
      }
   }
   closedir($pointeur);
}
 
$files = array();
$directory = dirname(__FILE__)."/xml/111208-photos_ADF";
lister($directory, $files);
foreach($files as $filename) {
   echo $filename.'<br/>';
}
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/12/2011, 20h33   #10
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2011
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 39
Points : 19
Points : 19
Citation:
Envoyé par rawsrc Voir le message
Oui c'est du récursif donc c'est normal que t'ais rien ($files est réinitialisé à chaque appel)
Ca marche ! merci beaucoup !

mais je n'ai pas compris cette partie de code :
Code :
lister($chemin, array &$files)
que veut dire array&$files ? $files a ce moment la est directement declare comme array ?
soryo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 22h59   #11
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par soryo Voir le message
mais je n'ai pas compris cette partie de code :
Code :
lister($chemin, array &$files)
que veut dire array&$files ? $files a ce moment la est directement declare comme array ?
Par défaut PHP passe les variables scalaires par copie, le fait de mettre un &$files indique que l'on souhaite passer la référence mémoire de la variable à la fonction et non une copie de la variable en elle-même.
En codant ceci : $files = array();, on initialise une variable tableau que notre fonction pourra remplir. Si tu regardes bien la fonction ne fait aucun return, elle se contente de remplir le tableau à l'adresse mémoire que nous lui avons fourni.
Vu que la variable a été initialisée en dehors de la fonction, nous pouvons vérifier son contenu après que la fonction ait terminé sa tâche.
Ce que l'on fait en ligne 24 avec foreach($files as $filename)
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 10h09   #12
Futur Membre du Club
 
Homme
Étudiant
Inscription : novembre 2011
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 39
Points : 19
Points : 19
Citation:
Envoyé par rawsrc Voir le message
Par défaut PHP passe les variables scalaires par copie, le fait de mettre un &$files indique que l'on souhaite passer la référence mémoire de la variable à la fonction et non une copie de la variable en elle-même.
En codant ceci : $files = array();, on initialise une variable tableau que notre fonction pourra remplir. Si tu regardes bien la fonction ne fait aucun return, elle se contente de remplir le tableau à l'adresse mémoire que nous lui avons fourni.
Vu que la variable a été initialisée en dehors de la fonction, nous pouvons vérifier son contenu après que la fonction ait terminé sa tâche.
Ce que l'on fait en ligne 24 avec foreach($files as $filename)
c'est tres utile et Merci beaucoup Rawsrc !
soryo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h18.


 
 
 
 
Partenaires

Hébergement Web