affichage d'un tableau

x@v
Mammouth du PHP | 570 Messages

22 mars 2007, 01:30

Bonjour,
j'ai une fonction que je ne comprend pas, elle affiche 3 cellule par 3.
function produitvu() {
  $reponse = new xajaxResponse();
  $req = "SELECT * FROM produits ORDER BY id";
  $query = mysql_query($req);
  $txt = '<table width="100%" border="0" cellspacing="5">';
  $i=0;
  while($tb = mysql_fetch_assoc($query)){
    if($i%3 == 0)  $txt .= '<tr>';
	$txt .= '<td align="center">' . $tb['nom'] . '<br><img width="110" height="161" src="' . $tb['photo'] . '" alt="' . $tb['nom'] . '" OnClick="xajax_detailvu(' . $tb['id'] . ');"><br>' . $tb['prix'] . '</td>';
    if(($i+1%3) == 0)  $txt .= '</tr>';
	$i++;
  } 
  $txt .= '</table>';      
  $reponse->addAssign("detail", "innerHTML", $txt);
  return $reponse->getXML();
}
donc je bloque sur le contrôle
 if($i%3 == 0)  $txt .= '<tr>';
et
    if(($i+1%3) == 0)  $txt .= '</tr>';
$i+1%3 sa fait 1 modulo de 3 = 0.33
Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 mars 2007, 01:42

Le résultat du modulo est le reste de la division euclidienne (partie entière) :

Code : Tout sélectionner

0 / 3 = 0, reste 0 (0 % 3 = 0) 1 / 3 = 0, reste 1 (1 % 3 = 1) 2 / 3 = 0, reste 2 (2 % 3 = 2) 3 / 3 = 1, reste 0 (3 % 3 = 0) 4 / 3 = 1, reste 1 (4 % 3 = 1) 5 / 3 = 1, reste 2 (5 % 3 = 2) 6 / 3 = 2, reste 0 (6 % 3 = 0) ...
Ainsi à chaque fois que ton modulo N est égal à 0 c'est une nouvelle ligne qui commence et à chaque fois que modulo N est égal à N-1, c'est que ta ligne se termine.... reste plus qu'à ajouter les <tr> et </tr> dans ces cas là :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

x@v
Mammouth du PHP | 570 Messages

22 mars 2007, 03:31

la logique est très interressante et pas courante.
Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 mars 2007, 09:25

Ben disons que tu peux également le faire sans le modulo, avec une variable dédié que tu incrémentes à chaque tour de boucle, et que tu remets à zéro à chaque fois qu'elle arrive à N éléments pour indiquer la nouvelle ligne
$cptLigne = 0;
while (...) {

  if($cptLigne==0) {// nouvelle ligne
    ...
  }

  $cptLigne++; // incrémentation du compteur

  if($cptLigne==$N) {// fin de la ligne
    $cptLigne = 0; // raz du compteur
    ...
  }
}
L'avantage du modulo, c'est de profiter du compteur global quand tu en as un, et d'éviter une seconde variable :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

x@v
Mammouth du PHP | 570 Messages

23 mars 2007, 06:40

avec le modulo si je remplace 3 par 2 j'ai deux vignette qui s'affiche
http://88.167.164.83/jean-paul/site_xajax/
C'est un grand avantage.