[Tuto][PHP] Nombre de Colonnes dynamique (opérateur Modulo)

1 message   •   Page 1 sur 1
Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 juil. 2008, 14:41

Lorsque vous récupérez des données en base pour les afficher dans un tableau, la solution la plus simple est d'afficher une ligne par enregistrement. En effet, il suffit de boucler sur les différents enregistrements retournés et pour chaque, commencer une nouvelle ligne (<tr>) remplir les cellules (<td>) et terminer la ligne (</tr>) avant de passer à la suivante.

Mais il arrive parfois que vous ayez besoin de mettre 2 éléments par ligne, voire 3, voire plus, pour faire une Galerie de photos, de produits, ou autre... La boucle, nous l'avons, les cellules aussi, la question est donc de savoir quand placer les balises <tr> et </tr> pour que le nombre de colonne corresponde. C'est ce que nous allons voir grace à l'opérateur modulo : "%" :)
On désigne par modulo l'opération de calcul du reste de la division euclidienne. Si "a" est un entier quelconque et "n" un entier strictement positif, on écrira "a % n" pour représenter le reste de la division de "a" par "n".
En clair, si l'on divise 7 par 3, le résultat (partie entière) de la division est 2, et le reste est de 1 (3*2+1=7). C'est de cette valeur (le 1) dont nous allons avoir besoin pour déterminer où nous en sommes sur la ligne, et donc savoir s'il faut ouvrir ou fermer les <tr>.

Supposons un tableau à 3 colonnes (mais vous verrez que cela fonctionne quel que soit le nombre) :
Position élément | Reste de la division (Position divisé par 3)
  0    1    2    |  0    1    2
  3    4    5    |  0    1    2
  6    7    8    |  0    1    2
Vous noterez que le reste de la division associé au premier élément de la ligne est toujours 0, et que le dernier correspond toujours au Nombre de colonnes-1. Il ne reste donc plus qu'à mettre cela en pratique pour alimenter notre galerie :
<?php 
$nbCols = 3; // nombre de colonnes du tableau 
$cpt = 0; // compteur d'éléments 
?>

<table> 
  <tr>
    <th style="width:<?php echo round(100/$nbCols);?>%;">Colonne 1</th> 
    <th style="width:<?php echo round(100/$nbCols);?>%;">Colonne 2</th> 
    <th style="width:<?php echo round(100/$nbCols);?>%;">Colonne 3</th> 
  </tr>
<?php

$rs = mysql_query(...); // exécution de la requête 
// Nota : on pourrait tout aussi bien parcourir les éléments d'un tableau ou les fichiers d'un dossier

while ($row=mysql_fetch_assoc($rs)) { // parcours des résultats 

    // début d'une ligne 
    if ($cpt%$nbCols==0) // on divise le nb d'élément par le nb de colonnes. Si le reste est de 0 ... 
        echo '<tr>'; // ..., alors on est sur le premier élément d'une ligne 


    // On place chaque élément dans une cellule du tableau 
    echo '<td>';
    echo ... // affichage de tout ce qu'on veut dans la cellule 
    echo '</td>'; 


    // fin d'une ligne
    if ($cpt%$nbCols==($nbCols-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ... 
        echo '</tr>'; // ..., on est sur le dernier élément d'une ligne

    $cpt++; // on incrémente le compteur pour savoir où on en est
} 

// Au cas où ...
if ($cpt!=0 && $cpt%$nbCols!=0) { // S'il n'y a pas eu assez de cellules dans la boucle pour finir la ligne ...
    echo '<td colspan="'.($nbCols - ($cpt%$nbCols) ).'">&nbsp;</td>'; // ... on complète avec une cellule vide de la bonne taille...
    echo '</tr>'; // ... et on ferme la ligne
}

?>

</table>
Et voilà, l'opérateur modulo n'a plus de secret pour vous :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

1 message   •   Page 1 sur 1