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 :

[Tableaux] Probleme de boucle for


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut [Tableaux] Probleme de boucle for
    Bonjour, je travaille actuellement sur deux bases de données distinctes, et donc je doit faire une jointure entre des infos sur ces deux bases par le biais d'un script php.

    Chaque requête est récupérée dans un tableau, et ce que je veux faire, c'est remplir le tableau jointure à partir des deux tableaux de requête à une certaine condition (numéro ISIN égal)

    Je parcours donc le premier tableau, et pour chaque valeur de ce tableau je parcours le second pour trouver si il existe un numéro d'ISIN.

    Jusque là, ca va. Je remplis ensuite le tableau jointure avec l'intégralité de mon second tableau plus la seconde colonne de mon premier tableau si la condition de test est vérifiée.

    Le problème, c'est que cela ne fonctionne que pour la premiere boucle, car je ne sais pas utiliser les foreach (*se cache*) et donc le pointeur sur mon tableau reste au dernier element, ce qui fait que la seconde colonne de mon premier tableau reste toujours à la meme valeur, et le champs dans mon tableau jointure conserve cette valeur pour toutes les lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $jointure = array();
    $cpt = 0;
    for ( $i = 0 ; $res =& $result->fetch() ; $i++ ) {
    	for ( $j = 0 ; $res2 =& $result2->fetch() ; $j++ ) {
    		echo "taille de res = ".count($res)." taille de res2 = ".count($res2);"   ";
    		if (strcmp($res["CVALISIN"],$res2["CODE_VALEUR"])){
    			$jointure[$cpt] = array("CVAL" => $res2["CVAL"],"CODE_PLISIN" => $res2["CODE_PLISIN"], "LIBELLE" => $res2["LIBELLE"], "CODE_PLACE" => $res2["CODE_PLACE"], "CODE_VALEUR" => $res2["CODE_VALEUR"], "MAR_COT_ID" => $res2["MAR_COT_ID"], "NB_CLIENTS" => $res["NB_CLIENTS"] );
    			$cpt++;
    			echo "taille de jointure = ".count($jointure)."\n";
    		}
    	}
    }

    J'ai essayé pas mal de choses avec les foreach, mais ca va pas du tout, je n'ai plus de valeurs dans mon tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $jointure = array();
    $cpt = 0;
    for ( $i = 0 ; $res =& $result->fetch() ; $i++ ) {
    	foreach ($res2 as $key => $valeur) {
    		echo "taille de res = ".count($res)." taille de res2 = ".count($res2);"   ";
    		if (strcmp($res["CVALISIN"],$valeur["CODE_VALEUR"])){
    			$jointure[$cpt] = array("CVAL" => $valeur["CVAL"],"CODE_PLISIN" => $valeur["CODE_PLISIN"], "LIBELLE" => $valeur["LIBELLE"], "CODE_PLACE" => $valeur["CODE_PLACE"], "CODE_VALEUR" => $valeur["CODE_VALEUR"], "MAR_COT_ID" => $valeur["MAR_COT_ID"], "NB_CLIENTS" => $res["NB_CLIENTS"] );
    			$cpt++;
    			echo "taille de jointure = ".count($jointure)."\n";
    		}
    	}
    }

    Voila voila, si quelqu'un peut m'expliquer le fonctionnement du foreach dans le cadre de ce tableau à deux dimensions, je ne pourrais que le remercier
    Qui osera affronter ma brute??
    Si tu perds, rejoins mon clan

  2. #2
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Je n'arrive à rien, j'ai même tenté un reset de $res2 à la fin de mon for imbriqué, mais rien à faire, je me retrouve toujours avec un NB_CLIENTS identique pour tous les tuples
    Qui osera affronter ma brute??
    Si tu perds, rejoins mon clan

  3. #3
    Membre éprouvé
    Avatar de ozzmax
    Inscrit en
    Novembre 2005
    Messages
    977
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2005
    Messages : 977
    Points : 959
    Points
    959
    Par défaut
    oui mais tu donne pas de conditions de limites a $i ??

    tu par...pour $i = 0 to $res qui égale le fetch...fait $++

    j'aimegine que ca provient de la conditions du milieu de tes boucles
    La perfection n'est pas un but, l'amélioration constante devrait l'être!
    La position des Développeurs de developpez avec les explications

  4. #4
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Comment ca?


    Avant cette boucle, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for ( $i = 0 ; $res =& $result->fetch() ; $i++ ) {
    	echo "NB_CLIENTS = ".$res["NB_CLIENTS"]."    ";
    	echo "CVALISIN = ".$res["CVALISIN"]."    ";
    	echo "CPLCOT = ".$res["CPLCOT"]."\n";
    }
    Et ca marche parfaitement :S

    Et le pire, c'est que j'ai mis un compteur pour mes deux boucles, elles font bien le bon nombre d'itération, je comprends vraiment plus rien!
    Qui osera affronter ma brute??
    Si tu perds, rejoins mon clan

  5. #5
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    J'ai inversé mes deux for, et ca m'a fait un truc super drole:

    je me retrouve avec les 6 premiers champs identiques, et le dernier qui change, pffff, je suis surlecuté ^^
    Qui osera affronter ma brute??
    Si tu perds, rejoins mon clan

  6. #6
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    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
    <?
    $arr_res = array();
    $arr_res[] = array("indice" => "1","libelle" => "toto");
    $arr_res[] = array("indice" => "2","libelle" => "tata");
    $arr_res[] = array("indice" => "3","libelle" => "titi");
    $arr_res[] = array("indice" => "4","libelle" => "tutu");
    $arr_res[] = array("indice" => "5","libelle" => "tete"); 
    $arr_res[] = array("indice" => "6","libelle" => "dodo");
    $arr_res[] = array("indice" => "7","libelle" => "dada"); 
     
    $arr_res2 = array();
    $arr_res2[] = array("indice" => "1","nb" => "10");
    $arr_res2[] = array("indice" => "2","nb" => "20");
    $arr_res2[] = array("indice" => "3","nb" => "30");
    $arr_res2[] = array("indice" => "6","nb" => "40");
    $arr_res2[] = array("indice" => "7","nb" => "50"); 
    $arr_res2[] = array("indice" => "8","nb" => "45"); 
     
     
    echo "RES\n";
     
    foreach($arr_res as $key => $value)
    {
    	echo "indice ".$value["indice"]." libelle ".$value["libelle"]."\n";
    }
     
    echo "RES 2\n";
     
    foreach($arr_res2 as $key2 => $value2)
    {
    	echo "indice ".$value2["indice"]." nb ".$value2["nb"]."\n";
    }
     
    echo "RES 3\n";
     
    $arr_res3 = array();
     
    foreach($arr_res as $key => $value)
    {
    	foreach($arr_res2 as $key2 => $value2)
    	{
    		if(!strcmp($value2["indice"],$value["indice"]))
    		{
    			$arr_res3[] = array("indice" => $value["indice"], "libelle" => $value["libelle"] , "nb" => $value2["nb"] );
    		}
    	}	
    }
     
     
    foreach($arr_res3 as $key3 => $value3)
    {
    	echo "indice ".$value3["indice"]." libelle ".$value3["libelle"]." nb ".$value3["nb"]."\n";
    }
     
    ?>

    Un collègue m'a montré sur un petit exemple le foreach, ca fonctionne, mais pas sur mes tableaux... Je dois pas être loin
    Qui osera affronter ma brute??
    Si tu perds, rejoins mon clan

  7. #7
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Hé non, ca ne marche toujours pas, les value["nomColonneIndexée"] ne renvoient rien
    Qui osera affronter ma brute??
    Si tu perds, rejoins mon clan

  8. #8
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut

    regarde ceci : http://fr.php.net/foreach

  9. #9
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par trotters213

    Ca fait une paye que j'ai regardé ca, et je vois toujours pas pourquoi ca marche pas!
    C'est meme de pire en pire:

    ca, ca marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for( $i = 0; $res =& $result->fetch(); $i++){
    	echo "NB_CLIENTS = ".$res["NB_CLIENTS"]."    ";
    	echo "CVALISIN = ".$res["CVALISIN"]."    ";
    	echo "CPLCOT = ".$res["CPLCOT"]."\n";
    }

    Mais ca, non:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($result as $key => $value){
    	echo "NB_CLIENTS = ".$value["NB_CLIENTS"]."    ";
    	echo "CVALISIN = ".$value["CVALISIN"]."    ";
    	echo "CPLCOT = ".$value["CPLCOT"]."\n";
    }

    Je sais pas pour vous, mais moi, je vois vraiment pas le problème!!!

    La premiere me donne tout ce que je cherche, la seconde revoie du vide :'(
    Qui osera affronter ma brute??
    Si tu perds, rejoins mon clan

  10. #10
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    tu peux nous montrer UN tableau sur lequel ça ne fonctionne pas stp.

  11. #11
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Bien sur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $query = "SELECT COUNT(DISTINCT LNOMRDCLI) AS NB_CLIENTS, CVALISIN, CPLCOT
    FROM ... ORDER BY ...";
     
    $result = $db->executeQuery($query);

    Avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for( $i = 0; $res =& $result->fetch(); $i++){
    	echo "NB_CLIENTS = ".$res["NB_CLIENTS"]."    ";
    	echo "CVALISIN = ".$res["CVALISIN"]."    ";
    	echo "CPLCOT = ".$res["CPLCOT"]."\n";
    }
    J'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NB_CLIENTS = 1389    CVALISIN = FR0000120354    CPLCOT = 025
    NB_CLIENTS = 1302    CVALISIN = FR0000130007    CPLCOT = 025
     
    ...
     
    NB_CLIENTS = 486    CVALISIN = FR0000125486    CPLCOT = 025
    NB_CLIENTS = 477    CVALISIN = FR0000120628    CPLCOT = 025
    NB_CLIENTS = 440    CVALISIN = FR0000074130    CPLCOT = 025
    et avec le foreach :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($result as $key => $value){
    	echo "NB_CLIENTS = ".$value["NB_CLIENTS"]."    ";
    	echo "CVALISIN = ".$value["CVALISIN"]."    ";
    	echo "CPLCOT = ".$value["CPLCOT"]."\n";
    }
    J'obtiens :

    NB_CLIENTS = CVALISIN = CPLCOT =



    Je tente de prendre la chose différement, je poste tout à l'heure si c'est concluant
    Qui osera affronter ma brute??
    Si tu perds, rejoins mon clan

  12. #12
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    c'est normal que ça ne marche pas : tu as en retour un tableau à 2 dimensions et toi tu traites un tableau à 1 dimension.
    Essaie un truc de ce style plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ($result as $v1) {
       foreach ($v1 as $v2) {
           echo "$v2\n";
       }
    }
    PS : ça ne sert à rien de faire $result as $key=>$value vu que tu ne te serts pas de $key

  13. #13
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Ha merci, je vais tenter, mais j'ai trouvé une solution de secours:


    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
    $temp = array();
    $temp2 = array();
     
    for( $i = 0; $res =& $result->fetch(); $i++){
            $temp[$res["CVALISIN"]] = array("NB_CLIENTS" => $res["NB_CLIENTS"],"CPLCOT" => $res["CPLCOT"], "CSENSOP" => $res["CSENSOP"], "NB_TRANSACTIONS" => $res["NB_TRANSACTIONS"] );
    }
    for( $i = 0; $res =& $result2->fetch(); $i++){
            $temp2[$res["CODE_VALEUR"]] = array("CVAL" => $res["CVAL"],"CODE_PLACE" => $res["CODE_PLACE"],"MAR_COT_ID" => $res["MAR_COT_ID"]);
    }
     
     
    // jointure est le tableau prenant les valeurs ayant un ISIN identique
     
    $jointure = array();
     
    foreach($temp as $key => $value){
    	foreach($temp2 as $key2 => $value2){
    		if (!strcmp($key2,$key)){
    			$jointure[$key] = array("CODE_PLACE" => $value2["CODE_PLACE"],"CVAL" => $value2["CVAL"],  "MAR_COT_ID" => $value2["MAR_COT_ID"], "NB_CLIENTS" => $value["NB_CLIENTS"]);
    		}
    	}
    }
    Comme ca ca fonctionne à coup sur
    Qui osera affronter ma brute??
    Si tu perds, rejoins mon clan

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

Discussions similaires

  1. probleme avec boucle "for"
    Par kentaro dans le forum ActionScript 1 & ActionScript 2
    Réponses: 16
    Dernier message: 30/01/2008, 20h15
  2. probleme de boucle for
    Par afssaLERH dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/10/2007, 17h30
  3. [Tableaux] Utiliser une boucle for dans un echo
    Par maoboy dans le forum Langage
    Réponses: 7
    Dernier message: 18/06/2007, 13h55
  4. Probleme de boucle for
    Par rawkus dans le forum Flash
    Réponses: 2
    Dernier message: 14/05/2007, 20h15
  5. [C#] Probleme de boucle for et random
    Par Freeman166 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/01/2005, 14h34

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