Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Web » PHP / ASP » [PHP] Bug ?

Strixouney
Visiteur
Citer - Posté le 28/08/2005 à 00:14
Voici un petit exemple de code qui bug chez moi :


<?
$table[1] = 'ceci';
$table[2] = 'est';
$table[3] = 'un';
$table[4] = 'test';

function truc()
{
global $table;
foreach($table as $index => $value)
{
machin();
echo $value.' ';
}
}

function machin()
{
global $table;
foreach($table as $index => $value)
{
// Aucun code, mais c'est juste pour l'exemple !
}
}

truc();
?>



Ce petit bout de code devrait "en théorie", affichier "ceci est un test". Or, chez moi, il n'affiche que "ceci".

Par contre, si je fais, dans la fonction "truc" par exemple


function truc()
{
global $table;
$table2 = $table;
foreach($table2 as $index => $value)
{
machin();
echo $value.' ';
}
}



Alors plus de problème !
C'est un bug ou une limitation du langage de ne pas pouvoir faire 2 foreach imbriqués portant sur la même variable ?
Vikrech
Visiteur
RemonterCiter - Posté le 28/08/2005 à 13:26
foreach faisant partie de la structure du langage, on pourrait considérer que ça devrait normalement être acquis.

Un peu d'explications tout de même:
Donc non ce n'est pas un bug de PHP c'est un comportement tout à fait cohérent à celui qui connaît la notion des pointeurs.
Pour chaque variable de type tableaux, PHP lui associe une sorte de pointeur unique. C'est ce même pointeur que tu peux déplacer avec les fonctions reset(), current(), next(), prev() et end().
L'instruction foreach va exécuter un certains nombres d'actions:
1°) Il remet le pointeur interne du tableau sur le premier élément
2°) A chaque itération, foreach récupère la valeur placée sous le pointeur.
3°) On déplace ensuite le pointeur sur le prochain élément.
4°) Le pointeur n'est pas réinitialisé au début du tableau à la fin de l'instruction foreach.

Avec ça tu devrais voir où est ton problème. A la fin de ta 2eme instruction foreach, le pointeur interne du tableau pointe sur le dernier élément. La 1ere instruction foreach n'a donc plus rien à passer en revue. Ca s'arrête. En théorie ton exemple devrait afficher "ceci", et c'est bien ce qu'il fait.
Ta 2eme solution fonctionne car quand tu fais une copie de ton tableau vers une nouvelle variable, seul les données sont copiées pas le pointeur interne. Ce qui fait que le pointeur de ton 2eme tableau est forcément sur ton premier élément.
De là à dire que c'est une limitation du langage non. C'est un comportement tout ce qu'il ya de plus logique que tu retrouves ailleurs.

La seule utilité que je vois à 2 instructions foreach portant sur une même variable c'est passer en revue un tableau à plusieurs dimmensions.
$my_table = __ton_tableaau__;
foreach ($my_table as $one_elem) {
foreach ($one_elem as $sub_elem) {

}
}

et là tu passes en revue ton tableau à 2 dimmensions. Et tu n'auras aucun problème.

Voilà voilà. Petit mot de la fin : Tout se résoud simplement en Relisant Ton Fichu Manuel !!
Strixouney
Visiteur
RemonterCiter - Posté le 28/08/2005 à 14:52
ok merci. En rencontrant ce problème, je me suis dis que le tableau était traité comme tu le décrit, mais je ne savais pas si c'était "fais expres", ou si c'était un bug.

Bon, c'était fais expres. Puis en allant sur nexen, ils en parlent. Bon, I'm going to RTFM (cool)

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2012 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,023 s - Crédits - Stats
1 connecté