IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Aucun return sur fonction toute simple


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 72
    Points : 45
    Points
    45
    Par défaut Aucun return sur fonction toute simple
    Bonsoir à tous,

    voilà je vous explique mon petits soucis pourtant et sûrement bien anodin.

    J'ai une fonction qui se charge de vérifier si un nom de fichier existe déjà (ex ici 'manon.jpg'), ce qui me permet de nommer mon fichier différemment si un autre fichier porte déjà le même nom.

    Cette fonction marche très bien à un détail près. Elle ne me passe pas le return dans ma variable appelante ($myImgNameVerif), alors que l'echo de sortie de ma fonction me retourne bien le nouveau nom 'manon-1.jpg'

    Voici ma fonction, ça sera plus parlant (cf comments code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    function fExist($path,$file,$i=1){
     
       //Si fichier existe, on rajoute un '-$i' avant l'extension 
       if (file_exists($path.'/'.$file)){      
            $newname=str_replace(substr($file,-4),'-'.$i.'.jpg',$file);        
            fExist($path,$newname,$i++);
        }
     
        //Si fichier n'existe pas, on retourne son nom
        else{       
            echo $file; // Renvoie bien le nouveau nom de fichier 'manon-1.jpg'
            return $file;
        }    
     
     }
     
    //Appel fonction contrôlant existance fichier
    $myImgNameVerif=fExist($source,'manon.jpg');
     
    //Affichage retour appel fonction pour obtenir nom fichier à utiliser
    echo 'Verif :'.$myImgNameVerif; // Ne me renvoie rien !!!!!
    ex pour $file valant 'manon.jpg' avec fichier portant le même nom dans $path

    Est ce que l'un de vous aurait une idée du pourquoi du comment ?

    J'ai essayé tout un tas de choses : conversion variable retour en string dans fonction....

    Par avance merci de vos retours.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    ton $file s'affiche au moment le plus profond de ta recursivité ; mais quand tu remontes la recursivité vers la sortie, tu perds le $file.

    je ne suis pas intellectuellement formé pour la recursivité mais je propose ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function fExist($path,$file,$i=1){
     
       //Si fichier existe, on rajoute un '-$i' avant l'extension 
       if (file_exists($path.'/'.$file)){      
            $newname=str_replace(substr($file,-4),'-'.$i.'.jpg',$file);        
            $file = fExist($path,$newname,$i++);
        }
     
        //Si fichier n'existe pas, on retourne son nom
        else{       
            echo $file; // Renvoie bien le nouveau nom de fichier 'manon-1.jpg'
            return $file;
        }    
     return $file;
     }

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2009
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 156
    Points : 160
    Points
    160
    Par défaut
    je dirais même que le else ici peux être inutile...
    car la fonction "return" arrête l'exécution du script...
    j'aurai même fait ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function fExist($path,$file,$i=1){
     
       //Si fichier existe, on rajoute un '-$i' avant l'extension 
       if (file_exists($path.'/'.$file)){      
            $newname=str_replace(substr($file,-4),'-'.$i.'.jpg',$file);        
            $file = fExist($path,$newname,$i++);
            return true;
        }
     return $file;
     }
    si le fichier existe, tu relance une deuxième instance de ta fonction avec un +1 à $i et le "return true" terminera ta première instance du coup la fonction n'executera pas ton "return $file;" de sortie, par contre si ta condition n'est pas respecté, la fonction continue, donc ton "return $file" est exécuté...

    La solution de sabotage aurai pu être bonne, mais vu que le return stop ton code exécuté, le dernier return ne sera pas lancé a cause du premier, et par récursivité, il te manquera effectivement un niveau pour le sortir...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Code fait à l'arrache mais à priori ça devrait coller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function fExists( $path , $fileName , $n = 0 ){
    	if( $n == 0 ) $fileTest = $fileName;
    	else $fileTest = basename( $fileName , '.jpg' ) . '-' . $n . '.jpg';
    	if( file_exists( $path . '/' . $fileTest ) ){
    		return fExists( $path , $fileName , $n + 1 );
    	}
    	return $fileTest;
    }
    petites explications :
    - l'utilisation de basename( $fichier , '.jpg' ) permet de tronquer le '.jpg' en fin de nom du fichier, c'est plus simple que des substr et str_replace.

    - return fExists( $path , $fileName , $n + 1 ) attention à ne surtout pas utiliser $n++. Lorsque tu fais ça, la valeur de $n est passée à la fonction puis incrémentée, ce qui n'est pas le résultat que tu souhaites.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 72
    Points : 45
    Points
    45
    Par défaut
    Merci à tous pour votre aide. J'ai fait un "petit" mix des différentes solutions que vous me proposiez et ça passe bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function fExist($path,$file,$i=1){
        if (file_exists($path.'/'.$file)){
            $newname=basename( $file , '.jpg' ).'-'.$i.'.jpg';
            return fExist($path,$newname,$i+1);
        }
     
        return $file;
    }
    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. inline d'une fonction tout simple LNK2001
    Par hpfx dans le forum Débuter
    Réponses: 1
    Dernier message: 26/04/2009, 23h00
  2. [Yahoo UI] Return sur fonction (yui)
    Par vraipolite dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 18/04/2007, 17h21
  3. VBA sur excel tout simple
    Par JohnFidgeral dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/01/2007, 18h58
  4. Petite fonction toute simple, mais
    Par renaud26 dans le forum Général JavaScript
    Réponses: 46
    Dernier message: 21/07/2006, 14h34
  5. creation d'une procedure ou fonction toute simple?
    Par atlas2003 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 16/11/2005, 14h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo