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 :

Element suivant dans une boucle "Foreach"


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut Element suivant dans une boucle "Foreach"
    Bonjour,

    Je venais vous demander une petite chose :/
    Sauriez-vous comment obtenir l'élément suivant dans une boucle foreach?

    Car je possède un tableau associatif mais de la forme $tablo[$element][$id] (où $id est un numéro, et $element est une chaîne de caractères).

    Le problème c'est que j'ai absolument besoin de récupérer non pas $element mais "$element+1" :/ Je bloque depuis un sacré moment là-dessus..

    J'ai tenté de passer par une boucle "for" de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(i=0;i<count($tablo);i++){
        echo $tablo[$i+1];
    }
    Mais cette boucle ne peut évidemment pas fonctionner étant donné que $element est une chaîne de caractère... Une solution?

    Merci à vous

  2. #2
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    essay voir avec next() et prev()

    les manuels sont tes amis

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Citation Envoyé par hiul dragonfel Voir le message
    essay voir avec next() et prev()
    Si ça marche tu es mon dieu

    J'avais déjà vu ce fameux next() mais en visual basic, je ne savais pas que ça existait sous PHP Je test et je vous tiens au courant, merci encore

  4. #4
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour, ou sinon une petite fonction tirée d'un exemple :

    Code php : 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
     
     
    $tableau['cle1'][0] = 'a';
    $tableau['cle2'][0] = 'b';
    $tableau['cle2'][1] = 'c';
    $tableau['cle3'][0] = 'd';
    $tableau['cle4'][0] = 'e';
     
    function array_key_relative($array, $current_key, $offset = 1) {
     
            $keys = array_keys($array);
            $current_key_index = array_search($current_key, $keys);
     
            if(isset($keys[$current_key_index + $offset])) {
                return $keys[$current_key_index + $offset];
            }
            return false;
       }
     
     
    echo array_key_relative($tableau, 'cle1', 1);
    // --- affiche cle2
     
    echo array_key_relative($tableau, 'cle1', 3);
    // --- affiche cle4
     
    echo array_key_relative($tableau, 'cle4', -1);
    // --- affiche cle3

  5. #5
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    quite à lui donner un truc comme ça autant que ça marche tout le temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function array_key_relative($array, $offset = 0){
       if($offset < 0){
          for($i = $offset; $i < 0; $i++)prev($array);
          return key($array) != NULL ? key($array): key(reset($array));
       }elseif($offset > 0){
          for($i = 0; $i < $offset; $i++)next($array);
          return key($array) != NULL ? key($array): key(end($array));
       }else return key($array);
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Hum ça déconne

    si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $var=next($tablo);
    echo $var;
    Ca me retourne la clé de l'élément suivant :/
    Par exemple si j'ai $tablo[1]["bonjour"] et $tablo[2]["salut"] ben ça me récupère "2", et moi je voudrais le "salut"

    Une idée? Merci en tout cas

    EDIT : Je n'avais pas vu vos deux réponses entre-temps Je vais manger, je testerai tout ça tout à l'heure! merci à tous

  7. #7
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    et avec ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $tableau[1] = "salut";
    $tableau[2] = "coucou";
    $tableau[3] = "yo";
     
    $var = next($tableau);
     
    echo($var) // coucou

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Citation Envoyé par hiul dragonfel Voir le message
    et avec ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $tableau[1] = "salut";
    $tableau[2] = "coucou";
    $tableau[3] = "yo";
     
    $var = next($tableau);
     
    echo($var) // coucou

    Evidemment votre code fonctionne, mais mon $tableau n'est pas comme le vôtre.. C'est un tableau à deux dimensions que je possède (donc $tableau[$element][$id]).
    Tout le problème vient de cette chaîne

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    J'ai pratiquement résolu mon problème, en modifiant tout simplement mon tableau! Il se présente maintenant sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $tableau[$cle][$valeur]
    Mais maintenant j'ai un petit problème bien étrange.. Quand je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach($tableau as $element=>$val){
        echo $val;
    }
    Cela me retourne "chaine1","chaine2",..."chaine6"; Donc pas de problème pour le moment. Mais si je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $courant=current($tableau);
    echo $courant;  // me retourne "chaine1", donc OK.
     
    foreach($tableau as $element=>$val){
        $suivant=next($tablo_final);
        echo $suivant;  // m'affiche "chaine3", "chaine4"..."chaine6"; Où est passé "chaine2" ??
    }
    Donc voilà, j'ai "chaine2" qui saute, et je ne vois pas pourquoi (du coup tout est décalé dans ce que je souhaite faire

    Merci à tous

  10. #10
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    normal, tu fais un next avant ton echo du coup il saute à l'enregistrement suivant

  11. #11
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    oups

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Mais pourtant je suis obligé de faire mon next avant mon echo non?!
    Voilà ce qui se passe si je fait de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $courant=current($tableau);
    echo $courant;  // me retourne "chaine1", donc OK.
     
    foreach($tableau as $element=>$val){
        echo $suivant;  
        $suivant=next($tablo_final);
    }
    Cela m'affiche : "chaine1", "chaine1", "chaine2", "chaine3"... "chaine6".

    Moi ce que je souhaiterai c'est afficher la première valeur avant la boucle foreach (donc mon $courant qui fonctionne), et ensuite faire la boucle foreach mais en démarrant à la deuxième valeur

    Merci de prendre le temps de m'aider en tout cas, c'est très sympa de votre part

  13. #13
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    euh tu peux nous donner un traitement plus cohérent s'il te plais ?

    je pige pas en quoi ça t'avance.

    tu veux faire un truc comme ca ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    foreach($tableau as $element=>$val){
        if(next($tableau) == $val){
            echo("Ok");
        }else echo("Ko");
    }
    sinon je vois pas l'utilité.

    PS: que vient faire $tablo_final là-dedans ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Okay je vais vous expliquer. Je souhaite obtenir au final une requête SQL. En gros, PHP va me créer ma requête et me l'afficher au final. Je vais vous donner des exemples :

    $tableau[$id][$element] se compose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $tableau["table1"]["svt"]="table1.champ1=table2.champ2"
    $tableau["table2"]["svt"]="table2.champ2=table3.champ3"
    $tableau["table3"]["svt"]="table3.champ3=table4.champ4"
     
    etc... jusqu'à 5.
    L'idée est que ce tableau comporte des jointures entre mes tables de mon tableau $tables. $tables peut contenir de 1 à 6 tables (cela dépend des cas).

    Par exemple, si $tables contient ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $tables[0]="table1";
    $tables[1]="table2";
    $tables[2]="table3";
    Alors ici je sais que je devrais faire une jointure entre "table1" et "table2", et entre "table2" et "table3";

    Voilà maintenant pourquoi je souhaite faire cette étrange boucle foreach : je m'intéresse ici à la partie "jointures" de ma requête finale. Je veux donc faire ceci :
    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
     
    $t=current($tables);						
    $var2=count($tables);
    	if(var2==1){ // si une seule table concernée
    		$req_part3='FROM '.$t;  // la requête s'arrête donc ici.	
    	}else{
    		$req_part3='FROM '.$t;  // soit : FROM table1
     
    			foreach($tables as $element=>$val){
    						$svt=next($tables); // donc normalement "table2"
    						$req_part3=$req_part3.' INNER JOIN '.$svt.' ON '.$tableau[$val]["svt"];	
     
    					}	
    				}
    			}
    	}
    Le résultat attendu est donc quelque chose dans le style :
    req_part3= FROM "table_courrante" INNER JOIN "table_suivante" ON "jointure associée à la table courrante"


    Voilà, merci encore

  15. #15
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Re

    et si tu remplaces :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $req_part3=$req_part3.' INNER JOIN '.$svt.' ON '.$tableau[$val]["svt"];

    par ca en virant ton next ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $req_part3 .= ' INNER JOIN '.$val.' ON '.$tableau[$val]["svt"];

    Je comprends pas ton obstination a vouloir utiliser current, next etc...

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Citation Envoyé par Madfrix Voir le message
    Re

    et si tu remplaces :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $req_part3=$req_part3.' INNER JOIN '.$svt.' ON '.$tableau[$val]["svt"];

    par ca en virant ton next ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $req_part3 .= ' INNER JOIN '.$val.' ON '.$tableau[$val]["svt"];

    Je comprends pas ton obstination a vouloir utiliser current, next etc...
    En fait quand tu fais une requête SQL (et je ne t'apprends sûrement rien), tu fais un "FROM table" et que tu joins (donc INNER JOIN) avec une autre table (donc ici c'est la suivante de mon tableau $tables).
    Et ensuite les paramètres de jointures (donc $tableau[$val]["svt"]) concernent la table courrante. Voilà pourquoi ma ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req_part3=$req_part3.' INNER JOIN '.$svt.' ON '.$tableau[$val]["svt"];
    doit comporter un élément courant et l'élément suivant du tableau $tables en même temps (le "$svt" étant la table suivante, et le "$val" étant la table courante)

    Mais j'ai finalement résolu mon problème hier soir, je prendrais le temps de poster la solution tout à l'heure

    En tout cas merci beaucoup de m'avoir lu et aidé, c'est très sympa

  17. #17
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    sinon tu peux faire un truc comme ça non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $i = 0;
    foreach($tables as $nomTab=>$table){
       if($i++ == 0) $req .= "from ".$nomTab; // etc...
       else $req .= "inner join ".$nomTab; // etc...
    }
    ça fonctionnerai pas dans ton cas ?

Discussions similaires

  1. Passer directement a l'iteration suivante dans une boucle for
    Par sundjata dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 26/07/2023, 12h40
  2. Suivant dans une boucle
    Par kaking dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2009, 08h21

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