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 :

Comportement étrange dans boucles foreach


Sujet :

Langage PHP

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Points : 58
    Points
    58
    Par défaut Comportement étrange dans boucles foreach
    Bonjour,

    Je vous demande une petite aide car j'ai un comportement bizarre dans mes boucles PHP, je vous décris le problème :

    Je fais une boucle sur toutes mes régions et pour chacune d'entre elles j'affiche 3 éléments :
    - Une dropdownlist avec pour valeur tous les pays et par défaut celui auquel la région est rattaché est sélectionné.
    - Un input text avec pour valeur le nom de la région concernée
    - Un autre input text avec pour valeur le symbole de la région.

    Le but étant bien sûr de pouvoir modifier chaque valeur est de sauvegardé.

    Voici le code HTML + PHP pour obtenir cela :

    view.php
    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
    28
    29
    30
    31
    32
    33
    34
     
    <div class="container">
        <form method="POST" action="#">
            <div class="edit">
            <?php foreach($regions as $id => $array): ?>
                <?php foreach($array as $pays_id => $arValue): ?>
                    <?php foreach($arValue as $cle => $value): ?>
                        <?php if($cle == 'nom'): ?>
                            <select name="truc" class="select_pays">
                                <?php foreach($pays as $k => $p): ?>
                                    <?php foreach($p as $clef => $country): ?>
                                        <?php if($clef == 'nom'): ?>
                                            <option value="<?php echo $k; ?>" 
                                                <?php if($k == $pays_id) { echo 'selected="selected"'; } else { echo ''; }?>>
                                                    <?php echo $country; ?>
                                            </option>
                                        <?php endif; ?>
                                    <?php endforeach; ?>
                                <?php endforeach; ?>
                            </select>
                            <input type="text" name="regions_edit[<?php echo $id; ?>][name]" value="<?php echo $value; ?>" />
                        <?php else: ?>
                            <?php if($cle == 'symbole'): ?>
                                <input type="text" name="regions_edit[<?php echo $id; ?>][symbole]" value="<?php echo $value; ?>" /><br />
     
                                <?php endif; ?>
                        <?php endif; ?>
                    <?php endforeach; ?>
                <?php endforeach; ?>
            <?php endforeach; ?>
            </div>     
            <input type="submit" value="Ok" name="Ok" />
        </form>
    </div>
    actions.php :

    Pour ceux qui ne connaissent pas Doctrine : les lignes Doctrine_Core:: correspondent à des requêtes SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $regions = Doctrine_Core::getTable('Regions')->getRegionsWithId();
          $this->regions = $regions;
          echo '<pre>';
          die(var_dump($regions));
     
          $pays = Doctrine_Core::getTable('Pays')->getPaysWithId();
          $this->pays = $pays;
    Le résultat de régions est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    array(2) {
      [id_region]=>
      array(1) {
        [pays_id]=>
        array(2) {
          ["nom"]=> valeur
          ["symbole"]=> valeur
        }
      }
    }
    En l'occurence ici ça vaut :

    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
     
    array(2) {
      [1]=>
      array(1) {
        [2]=>
        array(2) {
          ["nom"]=>
          string(12) "Rhône-Alpes"
          ["symbole"]=>
          string(2) "RA"
        }
      }
      [2]=>
      array(1) {
        [1]=>
        array(2) {
          ["nom"]=>
          string(10) "Bourgogne"
          ["symbole"]=>
          string(2) "BO"
        }
      }
    }
    Ensuite pays est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    array(3) {
      [id_pays]=>
      array(2) {
        ["nom"]=> valeur
        ["symbole"]=> valeur
      }
    Mon problème est donc le suivant :
    Lorsque je modifie le select de la première région, quel que soit le choix, je récupère toujours la valeur 1 dans $_POST alors que le HTML généré est correct :
    Voici le code récupéré par Firebug :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <select class="select_pays" name="truc">
    <option value="1"> TT </option>
    <option selected="selected" value="2"> Bidule </option>
    <option value="3"> Truc </option>
    </select>
    Peu importe quel choix je sélectionnerai la variable $_POST['truc'] sera toujours égale à 1.

    Alors que si je change le select de la 2e région, là aucun soucis il me retrouve bien la bonne valeur sélectionnée....

    Pourriez-vous m'aider à me decanter de ce soucis ?

    Merci.

  2. #2
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    282
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 282
    Points : 286
    Points
    286
    Par défaut
    Pourquoi tu écris et tu fermes PHP à chaque ligne ? Ton code est vraiment illisible à cause de ca je trouve ....

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Points : 58
    Points
    58
    Par défaut
    On m'a appris comme ça désolé pour la lecture.
    Sinon une idée du pourquoi de ce comportement ?

  4. #4
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    En effet première fois que je vois une pareille horreur. O.o

    Pour ta variable qui change... Si le HTML est correct c'est que tu as du code PHP qui modifie la tableau $_POST, ou bien un code JS qui modifie la valeur postée au submit du formulaire.

    Fais un var_dump($_POST); en début de fichier pour voir ce que tu récupères du formulaire.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonsoir,
    Traites la remarque de transgohan.
    Ensuite j'ai repris ton code afin d'en améliorer la lisibilité :
    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
    28
    29
    <?php
    $data = array();
    foreach($regions as $idRegion => $values) {
       $idPays = key($values);
       $data[] = array(
          'idRegion'   => $idRegion,
          'nom'        => $values[$idPays]['nom'],
          'symbole'    => $values[$idPays]['symbole']
       );
    }
    // closure : détermination du pays sélectionné
    $selectedCountry = function($idPays) { return ($idPays == $_POST['select_pays']) ? ' selected="selected"' : null; }
    ?>
    <div class="container">
       <form method="post" action="#">
          <div class="edit">
             <?php foreach($data as $row) { ?>
             <select name="truc" class="select_pays">
                <?php foreach($pays as $k => $p) { ?>
                <option value="<?php echo $k; ?>"<?php echo $selectedCountry($k); ?>><?php echo $p['nom']; ?></option>
                <?php } ?>
             </select>
             <input type="text" name="regions_edit[<?php echo $row['idRegion']; ?>][name]" value="<?php echo $row['nom']; ?>" />
             <input type="text" name="regions_edit[<?php echo $row['idRegion']; ?>][symbole]" value="<?php echo $row['symbole']; ?>" />
             <?php } ?>
          </div>
          <input type="submit" value="Ok" name="Ok" />
       </form>
    </div>
    Il faut toujours préparer ses données de manière à n'avoir aucun traitement à faire lors du rendu mis à part une ou deux boucles et sûrement pas 5 foreach imbriqués avec au milieu un petit if pour la beauté

    Comme toujours ça sort du four, je n'ai rien testé, donc peut-être boulette, à toi d'adapter...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Points : 58
    Points
    58
    Par défaut
    Merci pour vos remarques.
    Toutefois j'ai bien un var_dump($_POST) en début de mon fichier actions et comme précisé dans mon premier post que justement quand je valide le formulaire le sélect la valeur est toujours 1 uniquement pour la première région alors que la 2e région son sélect répond correctement. Je n'ai aucun js qui modifie le tableau et je ne le modifie pas entre temps en php non plus... d'où mon incompréhension

    Cela dit je vais essayer de réorganiser mon compte sur l'exemple de rawsrc car le problème vient peut-être de mes innombrables foreach imbriqués.

    EDIT : On y voit tout de suite plus clair avec ton code rawsrc, merci pour l'exemple, je m'efforcerai de le suivre autant que possible.

    Pour ce qui est du comportement bizarre j'ai trouvé : en effet mon select s'appelant "truc" et étant dans un foreach, la valeur du dernier select a écrasée toutes les précédentes, transgohan avait donc bien raison.

    Désolé de ce petit problème de débutant et merci de votre aide.

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

Discussions similaires

  1. Fonction reduire texte dans boucle foreach
    Par nanou22 dans le forum Langage
    Réponses: 2
    Dernier message: 01/09/2011, 22h11
  2. [MySQL] Insertion dans boucle foreach
    Par fluxx dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 10/08/2011, 16h26
  3. [2005] Data Flow dans boucle Foreach
    Par JB_paris dans le forum SSIS
    Réponses: 4
    Dernier message: 23/01/2009, 08h23
  4. Insérer puces (UL-LI) dans boucle foreach PHP
    Par RENAUDER dans le forum Langage
    Réponses: 1
    Dernier message: 21/01/2009, 11h18
  5. Problème commande do dans boucle foreach
    Par jchampen dans le forum Langage
    Réponses: 5
    Dernier message: 23/10/2008, 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