Page 1 sur 1

Problème avec deux while

Posté : 20 mai 2009, 15:33
par bidoum
Bonjour,

J'ai le code ci dessous qui me permet d'afficher les valeurs d'un tableau en plusieurs fois à des endroits différents. Le problème est qu'il ne s'affiche qu'une fois en fait...

Dans un fonction :
$nbtr = 0;
while(list($key, $val) = each($_SESSION['panier'])) {
$nbtr++;

if ($nbtr < 32) {
echo '<TABLE border=0 cellspacing=0 height="0" width=725>';
echo '<TR valign="top">';
echo '<TD style="width:13%">'.htmlspecialchars($_SESSION['panier'][$key]['ref']).'</TD>';
echo '<TD style="width:35%">'.htmlspecialchars($_SESSION['panier'][$key]['nom']).' &nbsp;'.$_SESSION['panier'][$key]['nomCouleur'].'</TD>';
echo '<TD style="width:9%" align="right">'.htmlspecialchars($_SESSION['panier'][$key]['quantite']).'</TD>';
echo '<TD style="width:11%" align="right">'.htmlspecialchars($_SESSION['panier'][$key]['prix']).',00</TD>';
echo '<TD style="width:8%" align="right">&nbsp;</TD>';
echo '<TD style="width:11%" align="right">'.htmlspecialchars($_SESSION['panier'][$key]['prix']).',00</TD>';
echo '<TD style="width:13%" align="right">'.htmlspecialchars($_SESSION['panier'][$key]['prix']).',00</TD>';
echo '</TR>';
echo '</table>';
}
}
Et plus loin, je voudrais afficher la suite des résultats.
Si je fais la même chose avec if ($nbtr >= 32) ça ne m'affiche rien... (Si je supprime le premier while par contre, cette fois il s'affiche)


Une idée de comment résoudre ce problème ??
Merci =)

Posté : 20 mai 2009, 22:59
par enneite
si il s'agit d'un tableau associatif ($key n'est pas une suite de nombres consecutifs)
on peut envisager cela:
on créée deux chaines vides, que l'on va remplir d'html grâce à une concatenation (on utilise le caractere "." pour concatener deux chaines)
Une fois les chaines construites, on les affiche à l'endroit ou l'on veut dans le code...
$chaine1="";
$chaine2="";
$nbtr=1;
foreach($_SESSION['panier'] as $key =>$tab)
{
if($nbtr<=32)
{
$chaine1.= '<TABLE border=0 cellspacing=0 height="0" width=725><TR valign="top">
<TD style="width:13%">'.htmlspecialchars($tab['ref']).'</TD>
...
<TD style="width:13%" align="right">'.htmlspecialchars($tab['prix']).',00</TD></TR>
</table>';
}
else
{
$chaine2.= '<TABLE border=0 cellspacing=0 height="0" width=725><TR valign="top">
<TD style="width:13%">'.htmlspecialchars($tab['ref']).'</TD>
...
<TD style="width:13%" align="right">'.htmlspecialchars($tab['prix']).',00</TD></TR>
</table>';
}
$nbtr++;

}
//plus loin...
echo $chaine1;

//encore plus loin
echo $chaine2;
Voilà, j'éspèe que j'ai bien compris ta demande..

Posté : 21 mai 2009, 12:00
par Ryle
each() retourne la paire clé/valeur courante du tableau array et avance le pointeur de tableau.

Après chaque appel à each(), le pointeur de tableau est déplacé au prochain élément, ou sur le dernier élément, lorsqu'on arrive à la fin. Vous devez utiliser reset() si vous voulez traverser le tableau à nouveau avec each().
En gros, ton premier while va parcourir tout le tableau (même s'il n'affiche que les 32 premiers éléments) et placer le pointeur à la fin de celui-ci. Du coup, lors de l'appel au 2nd while (et au 2nd each), il n'y a pas d'élément à lire, donc pas de résultat à afficher.

Tu peux utiliser reset() avant ton while pour remettre le pointeur au début du tableau, ou remplacer ton "while(list($key, $val) = each($_SESSION['panier']))" par un "foreach ($_SESSION['panier'] as $key => $val)" qui ne déplace pas le pointeur :)

Posté : 27 mai 2009, 10:19
par bidoum
each() retourne la paire clé/valeur courante du tableau array et avance le pointeur de tableau.

Après chaque appel à each(), le pointeur de tableau est déplacé au prochain élément, ou sur le dernier élément, lorsqu'on arrive à la fin. Vous devez utiliser reset() si vous voulez traverser le tableau à nouveau avec each().
En gros, ton premier while va parcourir tout le tableau (même s'il n'affiche que les 32 premiers éléments) et placer le pointeur à la fin de celui-ci. Du coup, lors de l'appel au 2nd while (et au 2nd each), il n'y a pas d'élément à lire, donc pas de résultat à afficher.

Tu peux utiliser reset() avant ton while pour remettre le pointeur au début du tableau, ou remplacer ton "while(list($key, $val) = each($_SESSION['panier']))" par un "foreach ($_SESSION['panier'] as $key => $val)" qui ne déplace pas le pointeur :)
Merci beaucoup ! O:)