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 :

parcourir une boucle FOR qu'une seule fois


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 76
    Points : 54
    Points
    54
    Par défaut parcourir une boucle FOR qu'une seule fois
    Bonjour à tous !

    Je vous expose mon problème :

    Je souhaite arrêter une boucle FOR. Je pensais que le code suivante marcherais mais malheureusement ça fait planter mon navigateur car elle ne s'arrête jamais :

    imaginez le code suivant simple :
    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
     
     
    $d[1] = 0;
    $d[2] = 0;
    $d[3] = 0;
    $d[4] = 0;
    $d[5] = 0;
     
    for ($i = 1; $i <= 5; $i++)
    {
         if ($d[$i] = 1)
         {
             break;
         }
         else
         {
             $i = "";
         }
    }
    Alors la chose que je me dis c'est que la boucle va être parcouru de 1 à 5, la variable $i prenant ainsi successivement les valeurs 1,2,3,4 puis 5 et enfin s'arrêter se rendant compte que pour n'importe qu'elle $i appartenant à [1;5], $d[$i] n'est jamais égal à 1.

    D'où le fameux ELSE devant renvoyer $i = "";

    Cependant il s'avère que l'itération se piège dans la boucle for et la réitère à l'infini.... Ce qui fait tout planter forcément.

    Ma question est donc, comment intégrer une condition supplémentaire dans la boucle FOR afin qu'elle n'effectue l'opération qu'une seule fois.

    Merci d'avance pour vos réponses !

    Cordialement,
    Globolite

  2. #2
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    exit(); pour sortir

  3. #3
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Points : 8 040
    Points
    8 040
    Par défaut
    Salut,

    En rajoutant un = dans ta condition ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $d[$i] == 1 ) {
        break;
    }
    Sinon pourquoi mettre un else ? Il ne fait rien et sert à rien dan ce cas.

    Edit : exit() arrête le script entier alors que break fait juste sortir de la boucle.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 76
    Points : 54
    Points
    54
    Par défaut
    Merci pour vos réponses !

    J'essaie ça de suite !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 76
    Points : 54
    Points
    54
    Par défaut
    Alors en effet le exit(); ne peut pas marcher dans mon cas.

    Mais j'ai essayé ce que tu as proposé et ça ne fonctionne pas également.

    En remplaçant simplement,
    $d[$i] = 1 par $d[$i] == 1 dans mon IF

    ça ne fonctionne pas également.

    Et mon ELSE avait pour but d'obtenir $i = "" si jamais $d[$i] n'est jamais égale à 1 une fois la boucle parcourue UNE SEULE FOIS.

  6. #6
    Membre régulier

    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 164
    Points : 75
    Points
    75
    Par défaut
    Tu mets dans ta condition $i = 6

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 76
    Points : 54
    Points
    54
    Par défaut
    Ah ça me paraît intéressant, ça donnerais un truc comme ç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
    16
    17
    $d[1] = 0;
    $d[2] = 0;
    $d[3] = 0;
    $d[4] = 0;
    $d[5] = 0;
     
    for ($i = 1; $i <= 5; $i++)
    {
         if ($d[$i] = 1 || $i = 6)
         {
             break;
         }
         else
         {
             $i = "";
         }
    }

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Mais dans le else, tu réaffectes ton compteur $i en lui donnant en plus comme valeur une chaine vide

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 76
    Points : 54
    Points
    54
    Par défaut
    Super Bovino !

    Ca fonctionne !!

    Merci beaucoup !!!!!

    TOPIC CLOS !

    ;-)

  10. #10
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Points : 8 040
    Points
    8 040
    Par défaut
    Peux-tu nous montrer ton code final stp ? parce que là j'ai du mal et mon aspirine ne fait pas encore effet...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 76
    Points : 54
    Points
    54
    Par défaut
    Figure toi Torgar que j'ai été un peu vite en besogne et je n'ai pas suivi le conseil de Bovino complétement.

    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
     
     
    $d[1] = 0;
    $d[2] = 0;
    $d[3] = 0;
    $d[4] = 0;
    $d[5] = 0;
     
    for ($i = 1; $i <= 5; $i++)
    {
         if ($d[$i] = 1 || $i = 6)
         {
             break;
         }
     
    }
     
    if ($i = 6)
    {
       $i = "";
    }

    Ce n'est pas tout à fait ce que proposait Bovino mais ça marche...
    Au moins ma boucle n'est parcourue qu'une seule fois...

  12. #12
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Points : 8 040
    Points
    8 040
    Par défaut
    j'me disais aussi !

    Comme veux-tu que ça fonctionne ? Tu mets des opérateurs d'affectation au lieu de comparaison dans des conditions.

    Tu es obligé de parcourir tout le tableau pour savoir si une valeur est à 1 ou non. Donc tu es obligé de faire autant de tour que tu as d'élément dans ton tableau.

    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
    $d[1] = 0;
    $d[2] = 0;
    $d[3] = 0;
    $d[4] = 1;
    $d[5] = 0;
    $trouve = false;
    for ($i = 1; $i <= 5; $i++) {
        if ($d[$i] == 1) {
            break; // la valeur 1 a été trouvé, pas besoin de continuer à chercher. Ici il s'arrêtera au quatrième élément du tableau.
            $trouve = true; // On indique qu'on a trouvé un élément à 1
        }
    }
     
    if (!$trouve) {
        $i = ""; // Aucun élément à 1 trouvé
    }
    else {
        // traitement si élément à 1 troué
    }

  13. #13
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Oui pour le exit(), j'ai fais vite et sans trop de reflexions

    Par contre les boucles for c'est qd même mieux sans les sorties ... il faut utiliser un while ou do-while avec une condition de sortie.

  14. #14
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Torgar, je crois que ce que veux faire Globolite est juste d'affecter les valeurs du tableau.

    Il est donc préférable d'utiliser array_ map.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $d[1] = 0;
    $d[2] = 0;
    $d[3] = 0;
    $d[4] = 0;
    $d[5] = 0;
    function setUn($elem){
        // Ici return 1 mais peut faire toute sorte d'opération sur $elem, l'élément en cours dans $d
        return 1;
    }
    $d = array_map('setUn', $d);

  15. #15
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Points : 8 040
    Points
    8 040
    Par défaut
    Là j'avoue ne plus comprendre la demande, déjà pas très claire à la base.

Discussions similaires

  1. [POO] parcourir un objet json avec une boucle for in
    Par bucheron007 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 19/01/2009, 13h55
  2. Réponses: 6
    Dernier message: 26/11/2007, 16h25
  3. [SQL] Boucle SQL dans une boucle for
    Par architecte dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/08/2007, 12h47
  4. Réponses: 2
    Dernier message: 08/03/2007, 12h06
  5. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 18h32

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