Rechercher : dans
Par :

Explication sur le for each

Dernière réponse le 3 mar 2009 à 12:03:07 artragis, le 2 mar 2009 à 18:19:49 
 Signaler ce message aux modérateurs

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;
            }
        }
    
}
Configuration: Windows Vista
Firefox 3.0.6

Meilleures réponses pour « explication sur le for each » dans :
VBA et les collections d'objets. VoirVBA et les collections d'objets Quand plusieurs (beaucoup de) contrôles sont mis sur une feuille ou un Userform il est parfois fastidieux d'écrire du code dans chaque évènement des contrôles. Ce Tuto vous permet de traiter vos contrôles comme...
[VBA] Détection de modification de cellule VoirExemple pour une MFC avec plus de 3 conditions. Private Sub Worksheet_Change(ByVal Target As Range) Dim Cel As Range For Each Cel In Target 'Adapter la/les plages. If Not Intersect(Cel, Range("B1:B30,D1:D30")) Is Nothing...
PhpMyAdmin - 1045- Access denied for user root@localhost VoirPhpMyAdmin - Access denied for user root’@localhost Cette astuce est destinée à ceux qui ont un problème d’ouverture de PhpMyAdmin (par exemple avec WAMP Server ou EasyPHP) avec l'erreur suivante : #1045- Access denied for user...
Télécharger NTFS for Mac OS X VoirAccès total en lecture et en écriture vers des volumes NTFS NTFS for Mac® OS X fournit un accès total (lecture ou écriture, formatage) vers des partitions NTFS. Compatible avec toutes les versions de NTFS Toutes les versions NTFS sont prises en...
VBScript - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (VBScript associe le mot clé true à...
Les éléments de transformation XSL VoirLes éléments de transformation Les éléments de transformations permettent de sélectionner et effectuer des opérations sur les éléments du document XML. Leur syntaxe est la suivante : Remarquez la présence du / indiquant que...

1

kij_82, le 3 mar 2009 à 11:12:25
  • +1

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 ^^

~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :)    ~

Répondre à kij_82

2

artragis, le 3 mar 2009 à 11:56:14

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?

Répondre à artragis

3

kij_82, le 3 mar 2009 à 11:58:15

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.

~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :)    ~

Répondre à kij_82

4

 artragis, le 3 mar 2009 à 12:03:07

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)

Répondre à artragis
Collection CommentÇaMarche.net