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 :

Implode et boucle foreach


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut Implode et boucle foreach
    Bonjour,

    J'ai cherché sur le net le moyen de réponse à mon problème et en désespoir de cause je me tourne vers vous.

    Je cherche à faire un implode et une concanation sur une double boucle foreach mais j'ai hélas l'impression que c'est impossible. Je souhaiterais en avoir confirmation et si cela est confirmé comment je dois faire pour réussir à regrouper mes données.

    Mon code est le suivant :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?php
    $req=$connexion->prepare("
    
    select h_lieu,h_dt2, h_ev, h_lat,h_long from historique WHERE h_lieu='BLOIS' or h_lieu='chateau de blois'
    
    "); // on va chercher tous les membres de la table qu'on trie par ordre croissant
     
    $req->execute(); // On éxecute la requète
     
    //Préparation des variables pour la boucle foreach
     
    $titre='';
    $stitre='';
    $i=0;
     
    //Première boucle foreach
    		foreach ($donnees=$req->fetchALL(PDO::FETCH_ASSOC|PDO::FETCH_GROUP) as $info => $bul) // Lancement de la boucle
    	{
    ($info);
    $bul[0]['h_lat'];
    $bul[0]['h_long'];
    if( !empty( $bul[0]['h_lat']))
    				{
    					$info_lat = $bul[0]['h_lat'];
    				}
    if( !empty( $bul[0]['h_long']))
    				{
    					$info_long = $bul[0]['h_long'];
    				}
    //Concanation des données de la première boucle foreach. Ici ça fonctionne
    if($titre!='') $titre.=',';
    $titre.='["'.$info.'",'.$info_lat.','.$info_long.']';
     
    //Deuxième boucle foreach
    				foreach ($bul as $bul)
    				{
    $bul['h_dt2'];
    $bul['h_ev'];
    if( !empty( $bul['h_dt2']))
    				{
    					$info_dt2 = $bul['h_dt2'];
    				}
    if( !empty( $bul['h_ev']))
    				{
    					$info_ev = $bul['h_ev'];
    				}
    // la concanation fonctionne mais je n'arrive pas à regrouper les données.
    if($stitre!='');
    $stitre.='["'.$info_dt2.'<br/>'.$info_ev.'"]';
     
     
    				}//Fermeture de la deuxième boucle foreach
     
     
    	}//Fermeture de la première boucle foreach
     
    ?>


    Merci d'avance à ceux qui prendront le temps de me lire.

    Astroma

  2. #2
    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 : 48
    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
    Bonjour,

    je n'ai pas compris du tout où tu veux en venir avec ton code...
    Tu peux expliquer simplement avec un exemple concret ce que tu souhaites obtenir comme résultat (titre et sous-titre)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    Merci d'avoir répondu.

    Pour être plus clair à partir de ma boucle foreach j'obtiens ceci pour chaque tour de boucle

    Lieu
    latitude
    longitude
    date (il y a plusieurs dates)
    evenements (il y a plusieurs événements)

    Je cherche à mettre le tout dans un array du type

    ["lieu",latitude,longitude,"date1 evenement1<br/>date2 evenement2<br/>date3 evement3....."]
    J'espère avoir été plus clair.

    Astroma

  4. #4
    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 : 48
    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
    Voici la soluce
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?php
     
    $sql = <<<'SQL'
    SELECT
        h_lieu,
        h_lat,
        h_long,
        h_dt2,
        h_ev
    FROM
        historique
    WHERE
        h_lieu = 'BLOIS' OR h_lieu = 'chateau de blois'
    ORDER BY
        h_lieu,
        h_lat,
        h_long
    SQL;
     
    /** @var PDOStatement */
    $stmt = $connexion->prepare($sql);
    $stmt->execute();
     
    $i      = 0;
    $keys   = array(); // array([] => "h_lieu;h_lat;h_long")
    $data   = array(); // array(key_id => array(h_lieu, h_lat, h_long))
    $evts   = array(); // array(key_id => array([] => "h_dt2 h_ev"))
    $titres = array();
     
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $key = "{$row['h_lieu']};{$row['h_lat']};{$row['h_long']}";
        // on vérifie si des données pour cette combinaison existent ou pas
        $id = array_search($key, $keys, true);
        if ($id === false) {
            $id = $i++;
            $keys[$id] = $key;
            $data[$id] = array($row['h_lieu'], $row['h_lat'], $row['h_long']);
        }
        $evts[$id][] = $row['h_dt2'].' '.$row['h_ev'];
    }
     
    foreach($keys as $id => $key) {
        $titres[] =
            '["'.$data[$id][0].'"'
            .','.$data[$id][1]
            .','.$data[$id][2]
            .'"'.implode('<br />', $evts[$id]).'"'
            .']';
    }
    jour de bonté dis donc

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut Un GRAND MERCI
    Merci beaucoup j'essaye immédiatement

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut J'ai un problème avec le code
    désolé de revenir mais j'ai un problème avec une ligne de ton code :

    J'ai fais 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php
    $req=$connexion->prepare("
    
    select h_lieu,h_lat, h_long, h_dt2,h_ev
    FROM historique
    WHERE h_lieu='BLOIS' or h_lieu='chateau de blois'
    ORDER BY h_lieu,h_lat
    						
    "); // on va chercher tous les membres de la table qu'on trie par ordre croissant
     
    $req->execute(); // On éxecute la requète
     
    //Création des variables
    $i=0;
    $keys = array();
    $evts = array();
    $titres = array();
     
    while ($donnees = $req-> fetch(PDO::FETCH_ASSOC))
    {
    $key = "($donnees['h_lieu']);($donnees['h_lat']);($donnees['h_long'])";
    $id = array_search($key,$keys,true);
    if ($id=== false)
    {
    $id=$i++;
    $keys[$id] = $key;
    $data[$id] = array($donnees['h_lieu'],$donnees['h_lat'], $donnees['long']);
    }
    $evts[$id][] = $donnees['h_dt2'].''.$donnees['h_ev']; // Concatenation dates et événements
    }//Fermeture de la boucle while
     
    foreach ($keys as $id=$key)
    {
    $titres[] =
    '["'.$data[$id][0].'"'
    .','.$data[$id][1]
    .','$data[$id][2]
    .'"'.implode('<br />', $evts[$id]).'"'
    .']';
    }
     
    ?>
    J'ai cette erreur là qui arrive

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\wamp\www\wekisto1\test105.php on line 37
    La ligne 37 c'est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $key = "($donnees['h_lieu']);($donnees['h_lat']);($donnees['h_long'])";
    J'essaye de la modifier depuis ton message mais rien à faire j'ai toujours l'erreur ?

    Merci encore pour ton aide

    Astroma

  7. #7
    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 : 48
    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
    Quand tu modifies mon code, fais le pas à pas :
    tu as mis des parenthèses au lieu des accolades (et ben c'est pas pareil)
    cf mon code ligne 35

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut Encore un problème avec mes excuses.
    Voila en fait j'avais besoin de récupérer mes infos à partir d'une variable dans la requete SELECT.

    le problème que je rencontre est que $row recupére bien les lignes que je demande mais avec le passage à$key elles sont écrasées. Et seul la dernière est conservé. Si vous pouvez me donner quelques conseils merci.

    Voici le 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    foreach ($theme as $cle1=>$theme1)// la clé sert à fixer un chiffre à chaque mot
    						{
     
     
    			// connexion SQL
    $sql = <<<SQL
    SELECT
        h_lieu,
        h_lat,
        h_long,
        h_dt2,
        h_ev
    FROM
        historique
    WHERE
    	h_id='$theme1'
    ORDER BY
        h_lieu,
        h_lat,
        h_long
    SQL;
     
    $stmt = $connexion->prepare($sql);
    $stmt->execute();
     
    //Création des variables
    $i=0;
    $keys = array();
    $evts = array();
    $titres = array();
    $tableauLieux='';
     
    while($row = $stmt->fetch(PDO::FETCH_ASSOC))
    {
     
    $key = "{$row['h_lieu']};{$row['h_lat']};{$row['h_long']}";
    $id = array_search($key, $keys, true);
    if ($id === false)
    {
    $id = $i++;
    $keys[$id] = $key;
    $data[$id] = array($row['h_lieu'], $row['h_lat'], $row['h_long']);
    }
    $evts[$id][] = $row['h_dt2'].' '.$row['h_ev'];// Concatenation dates et événements
     
    echo '<pre>';
    print_r($keys);
    echo '</pre>';
     
    }//Fermeture de la boucle while
    }
    foreach($keys as $id => $key)
    {
    $titres[] .=
    '"'.$data[$id][0].'"'
    .','.$data[$id][1]
    .','.$data[$id][2]
    .',"'.implode('<br />', $evts[$id]).'"'
    .'';
    }
     
    $titre = array ();
     
    foreach($titres as $element)
    {
     
    if($tableauLieux!='') $tableauLieux.=',';
     
    $tableauLieux.='['.$element.']';
        echo $tableauLieux; // affichera $prenoms[0], $prenoms[1] etc.
    }
    Avec un grand merci d'avance

    Astroma

  9. #9
    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 : 48
    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
    Citation Envoyé par astroma Voir le message
    le problème que je rencontre est que $row recupére bien les lignes que je demande mais avec le passage à$key elles sont écrasées. Et seul la dernière est conservé.
    C'est normal, relis ton code pas à pas et tu verras qu'à chaque boucle du foreach, tu vides les tableaux utilisés pour le stockage.

    Voici une piste pour y parvenir :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    <?php
     
        $sql =
    <<<'SQL'
    SELECT
        h_lieu,
        h_lat,
        h_long,
        h_dt2,
        h_ev
    FROM
        historique
    WHERE
        h_id = :theme
    ORDER BY
        h_lieu,
        h_lat,
        h_long
    SQL;
     
    /** @var PDOStatement */
    $stmt   = $connexion->prepare($sql);
    // je considère que h_id est un entier
    $stmt->bindParam(':theme', $theme1, PDO::PARAM_INT);
     
    //Création des variables
    $i            = 0;
    $keys         = array();
    $evts         = array();
    $titres       = array();
    $tableauLieux = '';
     
    // la clé sert à fixer un chiffre à chaque mot
    foreach ($theme as $cle1 => $theme1) {
        $stmt->execute();
     
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
     
            $key = "{$row['h_lieu']};{$row['h_lat']};{$row['h_long']}";
            $id = array_search($key, $keys, true);
            if ($id === false) {
                $id = $i++;
                $keys[$id] = $key;
                $data[$id] = array($row['h_lieu'], $row['h_lat'], $row['h_long']);
            }
            $evts[$id][] = $row['h_dt2'].' '.$row['h_ev'];// Concatenation dates et événements
        }
    }
     
    foreach($keys as $id => $key) {
        $titres[] =
        '"'.$data[$id][0].'"'
        .','.$data[$id][1]
        .','.$data[$id][2]
        .',"'.implode('<br />', $evts[$id]).'"'
        .'';
    }
     
    $titre = array ();
     
    foreach($titres as $element) {
        if ($tableauLieux !== '') {
            $tableauLieux.=',';
        }
        $tableauLieux .= '['.$element.']';
        echo $tableauLieux; // affichera $prenoms[0], $prenoms[1] etc.
    }
    Je t'invite quand même à aller potasser un peu le PHP parce qu'au fur et à mesure de tes problèmes tu vas galérer de plus en plus...

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut Merci
    Bonjour et merci pour la réponse.

    Le php je l'apprends depuis quelques semaines dans le dur. J'ai pour une fois envie de créer un projet perso et non pas de communiquer sur les projets des autres. Alors effectivement avoir les mains dans le clavier c'est un peu (beaucoup) différent.

    Merci pour ton accompagnement

    Astroma

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

Discussions similaires

  1. [JSTL] boucle forEach pour deux liste en même temps
    Par ruud002 dans le forum Taglibs
    Réponses: 1
    Dernier message: 28/09/2006, 15h54
  2. [Tableaux] Boucle foreach inbriquée
    Par nebil dans le forum Langage
    Réponses: 17
    Dernier message: 10/09/2006, 11h40
  3. [C# VS 2005] Collection et boucle foreach
    Par SDragon dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/07/2006, 19h43
  4. [C# 1.1]Boucles foreach imbriquees
    Par Nip dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/04/2006, 16h35
  5. [Tableaux] la boucle foreach
    Par jeanfrancois dans le forum Langage
    Réponses: 7
    Dernier message: 09/03/2006, 17h29

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