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 :

Tableau à deux dimensions, for each et nouvelle colonne [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Membre actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 56
    Points : 225
    Points
    225
    Par défaut Tableau à deux dimensions, for each et nouvelle colonne
    Bonjour à tous,

    Je me suis retrouvé face à un comportement que je ne comprends pas et j'aimerai arriver à le décrypter.
    Aussi je me tourne vers votre expérience.

    Le contexte:
    J'ai une liste d'identifiants ( des codes de personnes) à laquelle je souhaite combiner un booleen pour chaque année (il représente si oui ou non il s'est abonné cette année)
    Concrètement je souhaite obtenir un tableau à deux dimensions du type : Code [Année-1, Année-2]
    Ex:
    Code 2015 2016
    X1 OUI OUI
    X2 NON OUI
    X3 OUI NON

    Cependant pour obtenir ce résultat je dois ajouter chaque nouvelle année dans le tableau
    Code 2015
    X1 OUI
    X2 NON
    X3 OUI
    Je comptais donc créer cette nouvelle colonne initialisé à NON et c'est là que nous arrivons au coeur du sujet
    Pour passer de
    Code 2015
    X1 OUI
    X2 NON
    X3 OUI
    a
    Code 2015 2016
    X1 OUI NON
    X2 NON NON
    X3 OUI NON

    je comptais sur un foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach $tab as $value
    {
        $value[2016]=false;
    }
    Ce qui ne fonctionnait pas mon tableau initial demeurait sans colonne 2016.

    Cela a fonctionné quand j'ai utilisé l'index du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach $tab as $code => $value
    {
        $tab[$code][2016]=false;
    }
    Et j'ai bien obtenu mon tableau avec sa colonne 2016 initialisée à false.

    Mais pourquoi la première méthode ne fonctionne pas ? Est ce que j'ai commis une erreur d'interprétation ?
    Merci d'avance de vos lumières

  2. #2
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    Ta première erreur me semble être le fait que tu donne un alias "value" alors qu'il ne s'agit que de l'alias du tableau.

    Pour corriger cela en gardant ta manière, la méthode suivante devrait fonctionné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach $tab as $value => $LaVraiValeur
    {
        $LaVraiValeur[2016]=false;
    }
    De ce principe, pour ce que tu souhaite faire, tu peux aussi faire comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
     
    $tab = array();
    $tab['Code'] = array();
     
    foreach($tab['Code'] as $code)
    {
    $code['2016'] = FALSE;
    } 
     
    ?>
    En espérant t'avoir aidé !

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    En fait, le problème vient du fait que foreach travaille avec une copie du tableau. Quand tu fais foreach ($tab as $key => $value), $value est une nouvelle variable initialisée avec la valeur de $tab[$key].
    Autrement dit,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($tab as $value){
        $value[2016]=false;
    }
    c'est exactement pareil que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $keys = array_keys($tab);
    foreach($keys as $key) {
        $value = $tab[$key];
        $value[2016]=false;
    }
    A aucun moment, tu ne modifies le tableau original.
    Si tu veux modifier le tableau, il faut utiliser des références :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($tab as &$value){
        $value[2016]=false;
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 56
    Points : 225
    Points
    225
    Par défaut Merci
    En fait, le problème vient du fait que foreach travaille avec une copie du tableau.
    Quand tu fais foreach ($tab as $key => $value), $value est une nouvelle variable initialisée avec la valeur de $tab[$key].
    Donc si je suis bien en sortant de la boucle, $value est tout simplement perdue et cela même si je l'ai modifié...
    Il me semblait bien que c'était le cas en analysant le contenu de mes variables a grand coup de var_dump mais je
    ne comprenais pas pourquoi.

    Désormais je crois que j'utiliserais avec plus de parcimonie la syntaxe foreach $array => $value.

    Grand merci en tout cas c'est toujours un plaisir d'apprendre avec vous

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

Discussions similaires

  1. [Prototype] Trier un tableau à deux dimensions par colonnes
    Par G.D.V.L. dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 12/06/2007, 12h20
  2. Affichage d'un tableau à deux dimensions.
    Par Allan dans le forum C
    Réponses: 3
    Dernier message: 11/12/2005, 18h29
  3. Réponses: 1
    Dernier message: 18/11/2005, 11h38
  4. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38
  5. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50

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