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 :

Requête effectuée avec fonction recursive


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Par défaut Requête effectuée avec fonction recursive
    Salut

    Je souhaite affiché un message de reussite a la fin de ma fonction mais celle ci est une fonction recursive.


    voici ma fonction

    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
    23
    24
    function zipDir($path,&$zip)
    {
     
               if (!is_dir($path)) return;
     
               if (!($dh = @opendir($path)))
               {
                      echo("<b>ERREUR: Une erreur s'est produite sur ".$path."</b><br />");
                      return;
               }
                         while ($file = readdir($dh))
                         {
     
                                  if ($file == "." || $file == "..") continue;
                                  if (is_dir($path."/".$file))
                                  {       // fonction recursive
                                          zipDir($path."/".$file,$zip);
                                  }
                                  elseif (is_file($path."/".$file))
                                   {      // c'est si un fichier, on le rajoute au zip
                                          $zip->addFile(file_get_contents($path."/".$file),$path."/".$file);
                                   }
                         }
    }
    Merci

  2. #2
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Une solution "bricolée" qui permet de savoir quand on est dans la fonction appelée la première fois ou dans un appel récursif

    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
    23
    24
    25
    26
    27
    function zipDir($path,&$zip, $firstcall = true)
    {
                if (!is_dir($path)) return;
     
               if (!($dh = @opendir($path)))
               {
                      echo("<b>ERREUR: Une erreur s'est produite sur ".$path."</b><br />");
                      return;
               }
                         while ($file = readdir($dh))
                         {
     
                                  if ($file == "." || $file == "..") continue;
                                  if (is_dir($path."/".$file))
                                  {       // fonction recursive
                                          zipDir($path."/".$file,$zip, false);
                                  }
                                  elseif (is_file($path."/".$file))
                                   {      // c'est si un fichier, on le rajoute au zip
                                          $zip->addFile(file_get_contents($path."/".$file),$path."/".$file);
                                   }
                         }
     
    // si on est dans l'appel parent (premier appel)
    if($firstcall == true)
       echo "Tout s'est bien passé";
    }

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Par défaut
    Citation Envoyé par koopajah Voir le message
    Une solution "bricolée" qui permet de savoir quand on est dans la fonction appelée la première fois ou dans un appel récursif

    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
    23
    24
    25
    26
    27
    function zipDir($path,&$zip, $firstcall = true)
    {
                if (!is_dir($path)) return;
     
               if (!($dh = @opendir($path)))
               {
                      echo("<b>ERREUR: Une erreur s'est produite sur ".$path."</b><br />");
                      return;
               }
                         while ($file = readdir($dh))
                         {
     
                                  if ($file == "." || $file == "..") continue;
                                  if (is_dir($path."/".$file))
                                  {       // fonction recursive
                                          zipDir($path."/".$file,$zip, false);
                                  }
                                  elseif (is_file($path."/".$file))
                                   {      // c'est si un fichier, on le rajoute au zip
                                          $zip->addFile(file_get_contents($path."/".$file),$path."/".$file);
                                   }
                         }
     
    // si on est dans l'appel parent (premier appel)
    if($firstcall == true)
       echo "Tout s'est bien passé";
    }
    C'est un bon bricolage.
    Mais si la fonction c'est bien passé, alors faut le dire à la fin (donc dernier appel) et c'est la le plus dur.

  4. #4
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Logiquement c'est ce que fait mon code.

    Tu entres dans la fonction, tu arrives dans ton if, tu passes dans l'appel récursif, ensuite la fonction se termine, tu n'as pas firstcall qui est a true donc tu n'affiches rien, tu sors de la fonction. Tu es donc dans la fonction qui a été appelée (la fonction mère) et tu arrives à la fin de la fonctions => tu affiches le texte.

    Fais le test ca devrait fonctionner

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Par défaut
    Citation Envoyé par koopajah Voir le message
    Logiquement c'est ce que fait mon code.

    Tu entres dans la fonction, tu arrives dans ton if, tu passes dans l'appel récursif, ensuite la fonction se termine, tu n'as pas firstcall qui est a true donc tu n'affiches rien, tu sors de la fonction. Tu es donc dans la fonction qui a été appelée (la fonction mère) et tu arrives à la fin de la fonctions => tu affiches le texte.

    Fais le test ca devrait fonctionner
    Admettons que l'appel soit appelé 32 fois.
    Donc 33 passages.

    D'apres ta logique (et la mienne ), ton $firstcall == true sera présent dès le deuxieme passage....

    non?

  6. #6
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    c'est l'inverse justement.
    Dans le prototype de la fonction je dis "si le paramètre firstcall n'est pas donné, il prend la valeur true par défaut". Donc la première fois que tu appelles la fonction (dans ton code) tu ne lui donnes pas le troisieme paramètre (ou tu mets true comme tu préfères).

    Ensuite dans les appels récursifs, comme tu peux le voir, firstcall je lui ai mis la valeur false.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/02/2011, 09h18
  2. Problème requête Access avec fonction CStr
    Par ColDay dans le forum Windows Forms
    Réponses: 0
    Dernier message: 05/02/2010, 15h32
  3. Réponses: 3
    Dernier message: 04/07/2008, 17h03
  4. [Debutante] Fonction recursive avec un pointeur
    Par kidney dans le forum Débuter
    Réponses: 9
    Dernier message: 25/03/2006, 08h08
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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