Création d'un tableau "à la volée" pour afficher ses données, provenant d'un array() ou d'une base de données.
Affichage "en ligne" ou "en colonne".
<table> <tr> <td>ligne1 colonne1</td> <td>ligne1 colonne2</td> <td>ligne1 colonne3</td> <td>ligne1 colonne4</td> </tr> <tr> <td>ligne2 colonne1</td> <td>ligne2 colonne2</td> <td>ligne2 colonne3</td> <td>ligne2 colonne4</td> </tr> ... </table>
affiche :
ligne1 colonne1 | ligne1 colonne2 | ligne1 colonne3 | ligne1 colonne4 |
ligne2 colonne1 | ligne2 colonne2 | ligne2 colonne3 | ligne2 colonne4 |
... |
<html><body> <?php // $NbrCol : le nombre de colonnes // $NbrLigne : le nombre de lignes // ------------------------------------------------------- echo '<table>'; for ($i=1; $i<=$NbrLigne; $i++) { echo '<tr>'; for ($j=1; $j<=$NbrCol; $j++) { echo '<td>'; // ------------------------------------------ // AFFICHAGE ligne $i, colonne $j echo $affichage; // ------------------------------------------ echo '</td>'; } echo '</tr>'; $j=1; } echo '</table>'; ?> </body></html>
exemple amélioré
i X j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
2 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 |
3 | 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 |
4 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 |
5 | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 |
6 | 6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 |
7 | 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 |
8 | 8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72 |
9 | 9 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81 |
<html><body> <?php // $NbrCol : le nombre de colonnes // $NbrLigne : le nombre de lignes $NbrCol = 9; $NbrLigne = 9; // -------------------------------------------------------- // on affiche en plus sur les 1ere ligne et 1ere colonne // les valeurs a multiplier (dans des cases en couleur) // le tableau fera donc 10 x 10 // -------------------------------------------------------- echo '<table border="1" width="400">'; // 1ere ligne (ligne 0) echo '<tr>'; echo '<td bgcolor="#CCCCCC">i X j</td>'; for ($j=1; $j<=$NbrCol; $j++) { echo '<td bgcolor="#FFFF66">'.$j.'</td>'; } echo '</tr>'; // ------------------------------------------------------- // lignes suivantes for ($i=1; $i<=$NbrLigne; $i++) { echo '<tr>'; for ($j=1; $j<=$NbrCol; $j++) { // 1ere colonne (colonne 0) if ($j==1) { echo '<td bgcolor="#FFFF66">'.$i.'</td>'; } // colonnes suivantes if ($i==$j) { echo '<td bgcolor="#FFCC66">'; } else { echo '<td>'; } // ------------------------------------------ // AFFICHAGE ligne $i, colonne $j echo $i*$j; // ------------------------------------------ echo '</td>'; } echo '</tr>'; $j=1; } echo '</table>'; ?> </body></html>
Affichage d'un certain nombre de données dans un tableau :
Mais on ne connait pas à l'avance le nombre de données récupérées :
Récupération des éléments d'un tableau Array()
A noter : le premier indice d'un array() est 0 (zéro)
L'exemple ci-dessous affiche :
elt0 | elt1 | elt2 | elt3 |
elt4 | elt5 |
le code généré :
<table border="1"> <tr> <td>elt0</td> <td>elt1</td> <td>elt2</td> <td>elt3</td> </tr> <tr> <td>elt4</td> <td>elt5</td> <td> </td> <td> </td> </tr> </table>
Le code php :
<html><body> <?php // $NbreData : le nombre de données à afficher // $NbrCol : le nombre de colonnes // $NbrLigne : calcul automatique AVANT affichage // ------------------------------------------------------- // (exemple) $NbrCol = 4; $tableau = array('elt0','elt1','elt2','elt3','elt4','elt5'); // ------------------------------------------------------- $NbreData = sizeof($tableau); // ------------------------------------------------------- // calcul du nombre de lignes if (round($NbreData/$NbrCol)!=($NbreData/$NbrCol)) { $NbrLigne = round(($NbreData/$NbrCol)+0.5); } else { $NbrLigne = $NbreData/$NbrCol; } // ------------------------------------------------------- // affichage if ($NbreData != 0) { $k = 0; echo '<table border="1">'; for ($i=1; $i<=$NbrLigne; $i++) { echo '<tr>'; for ($j=1; $j<=$NbrCol; $j++) { if ($k<$NbreData) { echo '<td>'; // ------------------------------------------ // AFFICHAGE de l'element echo $tableau[$k]; // ------------------------------------------ echo '</td>'; $k++; } else { // case vide echo '<td> </td>'; } } echo '<tr>'; $j=1; } echo '</table>'; } else { echo 'pas de données à afficher'; } ?> </body></html>
C'est une façon différente d'aborder le problème :
- affichage "tant qu'il y a des données ..." (while ...)
- L'astuce : on utilise la propriété "modulo" (Mod en ASP et % en PHP )
qui renvoie le reste de la division entière du 1er chiffre par le 2ème
Exemple :
1 % 4 = 1 | 2 % 4 = 2 | 3 % 4 = 3 | 4 % 4 = 0 |
5 % 4 = 1 | 6 % 4 = 2 | 7 % 4 = 3 | 8 % 4 = 0 |
9 % 4 = 1 | ... |
Donc :
- quand le modulo = 1 : première colonne
- quand le modulo = 0 : dernière colonne
Le nombre de lignes (NbrLigne) est incrémenté au fur et à mesure :
- on le récupère A LA FIN. éventuellement
- ou on l'intercepte en cours de route (pour pagination)
L'exemple ci-dessous affiche :
elt0 | elt1 | elt2 | elt3 |
elt4 | elt5 |
le code généré :
<table border="1"> <tr> <td>elt0</td> <td>elt1</td> <td>elt2</td> <td>elt3</td> </tr> <tr> <td>elt4</td> <td>elt5</td> </tr> </table>
Le code php :
<html><body> <?php // $NbreData : le nombre de données à afficher // $NbrCol : le nombre de colonnes // $NbrLigne : calcul automatique a la FIN // ------------------------------------------------------- // (exemple) $NbrCol = 4; $tableau = array('elt0','elt1','elt2','elt3','elt4','elt5'); // ------------------------------------------------------- $NbreData = sizeof($tableau); // ------------------------------------------------------- // affichage $NbrLigne = 0; if ($NbreData != 0) { $k = 0; $j = 1; echo '<table border="1">'; while ($k < $NbreData) { if ($j%$NbrCol == 1) { $NbrLigne++; echo "<tr>"; $fintr = 0; } echo '<td>'; // ------------------------------------------ // AFFICHAGE de l'element echo $tableau[$k]; // ------------------------------------------ echo '</td>'; $k++; if ($j%$NbrCol == 0) { echo "</tr>"; $fintr = 0; } $j++; } if ($fintr!=1) { echo '</tr>'; } echo '</table>'; } else { echo 'pas de données à afficher'; } ?> </body></html>
Affichage de données récupérées par une requête dans une base de données.
- On veut afficher dans chaque case les données provenant d'un enregistrement
- On veut que le tableau fasse un nombre déterminé de colonnes.
Mais on ne connait pas à l'avance le nombre de données récupérées :
- il faut donc pouvoir afficher (automatiquement) autant de lignes que nécessaire.
Dans la partie "AFFICHAGE des DONNEES de la fiche" : Tout est possible !
- afficher plusieurs données,
- afficher des images,
- les organiser dans un tableau,
- ajouter des liens hypertext,
- ...
Même principe que "SANS calcul du nombre de lignes" :
- affichage "tant qu'il y a des données ..." while ...
- L'astuce : on utilise la propriété "modulo"
Exemple
La table MATABLE :
champs | valeurs | |||||||||
NUM | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
DONNEE | banane | betterave | boule | pomme | ananas | baie | bille | citron | bonbon | ballon |
TYPE | fruit | legume | jouet | fruit | fruit | fruit | jouet | fruit | douceur | jouet |
La requête : toutes les données commençant par un "b", classées par ordre alphabétique.
L'exemple ci-dessous affiche :
baie fruit |
ballon jouet |
banane fruit |
betterave legume |
bille jouet |
bonbon douceur |
boule jouet |
Le code généré :
<table border="1"> <tr> <td>baie<br><i>fruit</i></td> <td>ballon<br><i>jouet</i></td> <td>banane<br><i>fruit</i></td> <td>betterave<br><i>legume</i></td> </tr> <tr> <td>bille<br><i>jouet</i></td> <td>bonbon<br><i>douceur</i></td> <td>boule<br><i>jouet</i></td> </tr> </table>
Le code php
<?php include("_connexion.php") ; ?> <html><body> <?php // $NbreData : le nombre de données à afficher // $NbrCol : le nombre de colonnes // $NbrLigne : calcul automatique a la FIN // ------------------------------------------------------- // (exemple) $NbrCol = 4; // requête $table = 'MATABLE'; $condition = ' WHERE DONNEE LIKE 'b%' ORDER BY DONNEE ASC'; $query = 'SELECT * FROM '.$table.$condition; $result = mysql_query($query); // ------------------------------------------------------- $NbreData = mysql_num_rows($result); // ------------------------------------------------------- // affichage $NbrLigne = 0; if ($NbreData != 0) { $j = 1; echo '<table border="1">'; while ($val = mysql_fetch_array($result)) { if ($j%$NbrCol == 1) { $NbrLigne++; echo "<tr>"; $fintr = 0; } echo '<td>'; // ------------------------------------------ // AFFICHAGE des DONNEES de la fiche echo $val['DONNEE']; echo '<br>'; echo '<i>'.$val['TYPE'].'</i>'; // ------------------------------------------ echo '</td>'; if ($j%$NbrCol == 0) { echo "</tr>"; $fintr = 1; } $j++; } if ($fintr!=1) { echo '</tr>'; } echo '</table>'; } else { echo 'pas de données à afficher'; } ?> </body></html> <?php // déconnexion de la base mysql_close(); ?>
Les scripts précédents affichent les données "en ligne".
Affichage des résultats "en colonne" :
- pour un nombre de lignes (NbreLigne) défini,
- il faut pouvoir afficher (automatiquement) autant de colonnes que nécessaire.
(la plus simple)
Exemple avec Array() (même principe avec Base de données)
Principe :
- une table d'une ligne (invisible),
- dans chaque cellule : création d'une table d'1 colonne et NbreLigne lignes,
- ajout de cellules supplémentaires "tant qu'on a des données ..."
L'exemple ci-dessous affiche :
le code généré :
<table><tr> <td valign="top"> <table border="1"> <tr><td>elt0</td></tr> <tr><td>elt1</td></tr> <tr><td>elt2</td></tr> </table> </td> <td valign="top"> <table border="1"> <tr><td>elt3</td></tr> <tr><td>elt4</td></tr> <tr><td>elt5</td></tr> </table> </td> <td valign="top"> <table border="1"> <tr><td>elt6</td></tr> <tr><td>elt7</td></tr> <tr><td>elt8</td></tr> </table> </td> <td valign="top"> <table border="1"> <tr><td>elt9</td></tr> </table> </td> </tr></table>
Le code php :
<html><body> <?php // $NbreData : le nombre de données à afficher // $NbrLigne : le nombre de lignes // $NbrCol : le nombre de colonnes : calcul automatique // ------------------------------------------------------- // (exemple) $NbrLigne = 3; $tableau = array('elt0','elt1','elt2','elt3','elt4','elt5','elt6','elt7','elt8','elt9'); // ------------------------------------------------------- $NbreData = sizeof($tableau); // ------------------------------------------------------- $NbrCol = 0; // affichage if ($NbreData != 0) { $k = 0; echo '<table><tr>'; while ($k < $NbreData) { echo '<td valign="top">'; echo '<table border="1">'; for ($i=1; $i<=$NbrLigne; $i++) { if ($k < $NbreData) { echo '<tr><td>'; // -------------------------------------- // AFFICHAGE de l'element echo $tableau[$k]; // -------------------------------------- echo '</td></tr>'; $k++; } if ($i == $NbrLigne) { echo '</table>'; echo '</td>'; } } $NbrCol++; } echo '</tr></table>'; } else { echo 'pas de données à afficher'; } ?> </body></html>
La solution 1 est efficace, mais pas satisfaisante si on souhaite bien aligner toutes les cellules.
Principe :
- une seule table,
- le remplissage se fait ligne par ligne en testant le "modulo" :
Exemple
10 éléments (elt0 à elt9) sur 3 lignes.
On doit les afficher dans cet ordre : (voir le code généré)
ligne 0 : | elt0 - elt3 - elt6 - elt9 | 0 Mod 3 3 Mod 3 6 Mod 3 = 9 Mod 3 = 0 |
ligne 1 : | elt1 - elt4 - elt7 | 1 Mod 3 4 Mod 3 7 Mod 3 = ... = 1 |
ligne 2 : | elt2 - elt5 - elt8 | 2 Mod 3 5 Mod 3 8 Mod 3 = ... = 2 |
L'exemple ci-dessous affiche :
elt0 | elt3 | elt6 | elt9 |
elt1 | elt4 | elt7 | |
elt2 | elt5 | elt8 |
Le code généré :
<table border="1"> <tr> <td>elt0</td> <td>elt3</td> <td>elt6</td> <td>elt9</td> </tr> <tr> <td>elt1</td> <td>elt4</td> <td>elt7</td> </tr> <tr> <td>elt2</td> <td>elt5</td> <td>elt8</td> </tr> </table>
Le code php
<html><body> <?php // $NbreData : le nombre de données à afficher // $NbrLigne : le nombre de lignes // $NbrCol : le nombre de colonnes : calcul automatique // ------------------------------------------------------- // (exemple) $NbrLigne = 3; $tableau = array('elt0','elt1','elt2','elt3','elt4','elt5' ,'elt6','elt7','elt8','elt9'); // ------------------------------------------------------- $NbreData = sizeof($tableau); // ------------------------------------------------------- // affichage if ($NbreData != 0) { $i = 0; $NbrCol = 0; echo '<table border="1">'; for ($i=0; $i<$NbrLigne; $i++) { echo '<tr>'; $j = 0; while (($i+($j*$NbrLigne))%$NbrLigne==$i && ($i+($j*$NbrLigne))<$NbreData) { echo '<td>'; // -------------------------------------- // AFFICHAGE de l'element $k = ($i+($j*$NbrLigne)); echo $tableau[$k]; // -------------------------------------- echo '</td>'; $j++; if ($NbrCol<$j) { $NbrCol=$j; } } echo '</tr>'; } echo '</table>'; } else { echo 'pas de données à afficher'; } ?> </body></html>
Le script utilisant les indices de tableau :
- création d'un tableau array() contenant les données récupérées.
L'exemple ci-dessous affiche :
baie fruit |
bille jouet |
ballon jouet |
bonbon douceur |
banane fruit |
boule jouet |
betterave legume |
Le code généré
<table border="1"> <tr> <td>baie<br><i>fruit</i></td> <td>bille<br><i>jouet</i></td> </tr> <tr> <td>ballon<br><i>jouet</i></td> <td>bonbon<br><i>douceur</i></td> </tr> <tr> <td>banane<br><i>fruit</i></td> <td>boule<br><i>jouet</i></td> </tr> <tr> <td>betterave<br><i>legume</i></td> </tr> </table>
Le code php
<?php include("_connexion.php") ; ?> <html><body> <?php // $NbreData : le nombre de données à afficher // $NbrLigne : le nombre de lignes // $NbrCol : calcul automatique // ------------------------------------------------------- // (exemple) $NbrLigne = 4; // requete $table = 'MATABLE'; $condition = ' WHERE DONNEE LIKE 'b%' ORDER BY DONNEE ASC'; $query = 'SELECT * FROM '.$table.$condition; $result = mysql_query($query); // ------------------------------------------------------- $NbreData = mysql_num_rows($result); // ------------------------------------------------------- // creation d'un tableau array() par donnees $k=0; while ($val = mysql_fetch_array($result)) { $tableau1[$k] = $val['DONNEE']; $tableau2[$k] = $val['TYPE']; $k++; } // ------------------------------------------------------- // affichage if ($NbreData != 0) { $i = 0; $NbrCol = 0; echo '<table border="1">'; for ($i=0; $i<$NbrLigne; $i++) { echo '<tr>'; $j = 0; while (($i+($j*$NbrLigne))%$NbrLigne==$i && ($i+($j*$NbrLigne))<$NbreData) { echo '<td>'; // -------------------------------------- // AFFICHAGE de l'element $k = ($i+($j*$NbrLigne)); echo $tableau1[$k]; echo '<br>'; echo '<i>'.$tableau2[$k].'</i>'; // -------------------------------------- echo '</td>'; $j++; if ($NbrCol<$j) { $NbrCol=$j; } } echo '</tr>'; } echo '</table>'; } else { echo 'pas de données à afficher'; } ?> </body></html> <?php mysql_close(); ?>
Au lieu de créer un tableau array() pour chaque donnée récupérée (tableau1, tableau2, ...),
il est possible de créer un seul tableau array(), en PHP, c'est très simple et très pratique.
<?php // ... // ------------------------------------------------------- // creation d'un seul array avec toutes les donnees $k=0; while ($val = mysql_fetch_array($result)) { $tableau[$k] = $val; $k++; } // ------------------------------------------------------- // affichage // ... // -------------------------------------- // AFFICHAGE de l'element $k = ($i+($j*$NbrLigne)); echo $tableau[$k]['DONNEE']; echo '<br>'; echo '<i>'.$tableau[$k]['TYPE'].'</i>'; // -------------------------------------- // ... ?>