Explication sur le for each

Résolu/Fermé
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 - 2 mars 2009 à 18:19
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 - 3 mars 2009 à 12:03
Bonjour, j'ai commencé à apprendre l'algo et la prog sur le net et j'ai touché à VB.NET et JAVA avant de me mettre à Php depuis envire 2/3 mois. J'ai lu le tuto du site du zéro et j'ai appliqué dans un de mes sites.
Seulement aujourd'hui j'ai un projet de script qui a pour base 2 tableaux. Par souvenir des autres langages, je parcours ces tableaux avec for. Cependant il m'a été mainte fois dit sur le web qu'en PHP on a le foreach qui était plus approprié à ce genre de chose et était plus rapide.
Pour commencer, j'aimerai savoir, et surtout j'aimerai avoir des explications détaillées qui me permettraient de transformer ce fragment de code d'une boucle for vers une boucle foreach.
//Si on veut juste modifier le titre, on va récupérer les valeurs puis les mettre dans le bon groupe.
if(isset($_POST['titre'])){
    $titre=$_POST['titre'];
    $ancien_nom=$_POST['nom_du_groupe'];
      
        for($j=1; $j<$numero_groupe;$j++){
           if($groupe[$j]['titre']==$ancien_nom){
           $groupe[$j]['titre']=$titre;
            }
        }
    
}
A voir également:

4 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
3 mars 2009 à 11:12
Bonjour,

Simple, par "for each" il faut comprendre "pour chaque élément de mon tableau". Même principe qu'une boucle for normale donc, mise à par que la syntaxe est différente, ainsi que l'utilisation du tableau pour récupérer chaque résultat (équivalent à la récupération d'un élément i dans ton tableau)

if(isset($_POST['titre'])){
    $titre=$_POST['titre'];
    $ancien_nom=$_POST['nom_du_groupe'];

        // --- Avec for      
        for($j=1; $j<$numero_groupe;$j++){
           if($groupe[$j]['titre']==$ancien_nom){
              $groupe[$j]['titre']=$titre;
            }
        }
        
        // --- Avec foreach
        foreach($groupe as $oneGroup){
            if ($oneGroup['titre']==$ancien_nom){
                $oneGroup['titre'] = $titre;
            }
        }
    
}


Pour ce qui est de l'explication de "plus vite", je dirai que lorsque tu utilise une boucle for, tu tente à l'intérieur (c'est ton cas) d'accéder plusieurs fois à un objet situé à un indice i de ton tableau. Faire plusieurs fois l'accès à cet élément prend plus de temps que si tu référence cet élément par une variable, ce qui semble être le cas du foreach (comme en java finalement, créer une référence sur un objet situé dans un tableau permettra d'y accéder plus rapidement si on y fait appel plusieurs fois par la suite.

Bien sur, sur des algos relativement simple la différence ne se voit pas, c'est sur des choses complexes, avec plusieurs de ces boucles qu'au final tu peux avoir un petit gain de temps. Mais tout bon programmeur se doit d'optimiser au mieux n'importe quel programme ^^
8
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 146
3 mars 2009 à 11:56
Merci de ton explication qui est très complète, je reviens sur la syntaxe pour savoir si j'ai vraiment bien compris les choses :

je met foreach( 'le tableau que je parcours' as 'une nouvelle variable'){
la suite de mon code, ici une condition pour récupérer
}
en somme ça voudrait dire qu'en fait la boucle à analysé 1 à 1 les éléments, les as stocké au fur et à mesure dans ma nouvelle variable et on n'a plus qu'à faire le test
si j'ai bien compris la variable contient ici les indices (donc groupe 0, 1, 2, 3....i)
alors que si j'avais demandé foreach(tableau[2] as 'ma viariable')
il aurait mis uniquement les élément de la partie associative du tableau?

Est-ce que j'ai vraiment bien compris?
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
3 mars 2009 à 11:58
Oui c'est ça.
Pour ce qui est de ta dernière remarque, normalement c'est le cas également (variable[2] as newVariable)

A toi ensuite de faire attention au type de donnée contenu dans ta variable pour la suite de ton code.
0
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 146
3 mars 2009 à 12:03
Merci beaucoup de tout m'avoir expliqué. Ne t'inquiète pas, n'étant que débutant je ne stocke dans les tableaux que les variables que je contrôle vraiment (elles sont prédéfinies dans un menu déroulant, dans l'interface par exemple)
0