Affichage de données dans un tableau HTML
Affichage en Ligne ou en Colonne, provenant d'un array ou d'une Base de Données
Date de publication : 12 septembre 2008. Date de mise à jour : 3 juillet 2011.
Par
Jérôme Réaux (Pages de jreaux62)
PHP - Création "à la volée" d'un tableau html :
Afficher "proprement" des données tabulaires provenant
- d'un array(),
- ou d'une base de données.
Affichage
- "en LIGNE" (les données sont affichées horizontalement ligne après ligne),
- ou "en COLONNE" (affichage vertical colonne après colonne).
I. Avant-Propos
II. Tables simples
II-A. Structure d'un tableau HTML (table)
II-B. Tableau HTML simple de NbrCol colonnes par NbrLigne lignes
II-C. Table de multiplication : exemple amélioré
III. Affichage "en ligne" avec array()
III-A. Affichage "en ligne" avec array() - AVEC calcul du nombre de lignes nécessaires
III-B. Affichage "en ligne" avec array() - SANS calcul du nombre de lignes nécessaires
IV. Affichage "en ligne" avec Base de Données
V. Affichage "en colonne" avec array()
V-A. Affichage "en Colonne" - Solution 1 avec Array()
V-B. Affichage "en Colonne" - Solution 2, avec Array()
VI. Affichage "en colonne" avec Base de Données
VI-A. Affichage "en Colonne" avec BD - Solution 1
VI-C. Affichage "en Colonne" avec BD - Astuce
VII. Pour aller plus loin : fonctions
VIII. Pagination
IX. Conclusion
I. Avant-Propos
On a souvent besoin, ou envie, d'afficher ses données "proprement" :
- Données provenant d'un array() ;
- Ou d'une base de données.
La création "à la volée" d'un tableau html (table) est une bonne solution.
On peut aussi avoir besoin d'un affichage :
- -> "En ligne" (les données sont affichées horizontalement ligne après ligne),
- -> Ou "en colonne" (affichage vertical colonne après colonne).
Ce tutorial traite ces différents cas.
 |
Avec les écrans 16/9e (portable, ...), il devient intéressant d'envisager d'afficher "en colonne"
(hauteur fixe)
--> scroll horizontal (ça change du scroll vertical conventionnel !), donc original !
|
 |
Dans tous les scripts qui suivent, vous verrez une partie :
// -------------------------
// DONNEES A AFFICHER dans la cellule
// ................
// -------------------------
C'est à cet endroit que VOUS intervenez !
Il s'agit du contenu des cellules du tableau.
Les données à afficher dépendent de VOS besoins :
- plusieurs données peuvent être affichées (textes, images, ...)
- avec votre propre mise en page.
|
II. Tables simples
II-A. Structure d'un tableau HTML (table)
| Balises d'un tableau HTML |
| <table> </table> |
balises de début et fin d'une table html |
| <tr> </tr> |
(table row) rangée, ou ligne. |
| <th> </th> |
(table head) cellules d'en-tête
(cellules servant de titre aux colonnes)
autant de fois qu'il y a de colonnes |
| <td> </td> |
(table data) cellules de données
(afficher du texte, des images, une table...)
autant de fois qu'il y a de colonnes |
| Autres balises |
Se référer au cours : Les tableaux (XHTML et CSS) |
II-B. Tableau HTML simple de NbrCol colonnes par NbrLigne lignes
| Tableau html simple |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Tableau html simple</title>
</head>
<body>
<table>
<tbody>
<?php
for ($i=1; $i<=$NbrLigne; $i++)
{
?>
<tr>
<?php
for ($j=1; $j<=$NbrCol; $j++)
{
?> <td>
<?php
echo 'ligne '. $i .', colonne '. $j;
?> </td>
<?php }
?>
</tr>
<?php
}
?>
</tbody>
</table>
</body>
</html>
|
II-C. Table de multiplication : exemple amélioré
| Table de multiplication |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Table de multiplication</title>
</head>
<body>
<table border="1" width="400">
<?php
$NbrCol = 9;
$NbrLigne = 9;
?>
<thead>
<th>
<td bgcolor="#CCCCCC">i X j</td>
<?php for ($j=1; $j<=$NbrCol; $j++) {
?> <td bgcolor="#FFFF66"><?php echo $j; ?></td>
<?php } ?>
</th>
</thead>
<tbody>
<?php
for ($i=1; $i<=$NbrLigne; $i++) {
?>
<tr>
<?php for ($j=1; $j<=$NbrCol; $j++) {
if ($j==1) {
?> <td bgcolor="#FFFF66"><?php echo $i; ?></td>
<?php }
if ($i==$j) {
?> <td bgcolor="#FFCC66">
<?php } else {
?> <td>
<?php }
echo $i*$j;
?> </td>
<?php }
?>
</tr>
<?php $j=1;
}
?>
</tbody>
</table>
</body>
</html>
|
III. Affichage "en ligne" avec array()
Affichage d'un certains nombres de données dans un tableau :
- 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.
Récupération des éléments d'un tableau Array() :
- Le premier indice d'un array() est 0 (zéro)
- Le dernier indice est : count($tableau)-1
III-A. Affichage "en ligne" avec array() - AVEC calcul du nombre de lignes nécessaires
Première méthode :
- On détermine le nombre de données à afficher : count($tableau),
- et on en déduit le nombre de cellules nécessaire.
- les cellules vides sont remplies avec un espace .

| Affichage en ligne avec array() a- AVEC calcul du nombre de lignes |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Affichage en ligne avec Array - AVEC calcul du Nbreligne</title>
</head>
<body>
<?php
$NbrCol = 4;
$tableau = array('elt0','elt1','elt2','elt3','elt4','elt5');
$NbreData = count($tableau);
if (round($NbreData/$NbrCol)!=($NbreData/$NbrCol)) {
$NbrLigne = round(($NbreData/$NbrCol)+0.5);
} else {
$NbrLigne = $NbreData/$NbrCol;
}
if ($NbreData != 0)
{
$k = 0;
?>
<table border="1">
<tbody>
<?php for ($i=1; $i<=$NbrLigne; $i++)
{
?> <tr>
<?php for ($j=1; $j<=$NbrCol; $j++)
{
if ($k<$NbreData) {
?> <td>
<?php
echo $tableau[$k];
?> </td>
<?php $k++;
} else {
?> <td> </td>
<?php }
}
?> </tr>
<?php }
?>
</tbody>
</table>
<?php
} else { ?>
pas de données à afficher
<?php
}
?>
</body>
</html>
|
III-B. Affichage "en ligne" avec array() - SANS calcul du nombre de lignes nécessaires
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" (X % Y) qui renvoie le reste de la division entière de X par Y
| 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 |
10 % 4 = 2 |
11 % 4 = 3 |
... |
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 peut (éventuellement) le récupèrer A LA FIN,
- ou l'intercepter en cours de route (pour PAGINATION)

| Affichage en ligne avec array() b- SANS calcul du nombre de lignes |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Affichage en ligne avec Array - SANS calcul du Nbreligne</title>
</head>
<body>
<?php
$NbrCol = 4;
$tableau = array('elt0','elt1','elt2','elt3','elt4','elt5');
$NbreData = count($tableau);
$NbrLigne = 0;
if ($NbreData != 0)
{
$k = 0;
?>
<table border="1">
<tbody>
<?php
while ($k < $NbreData)
{
if (($k+1)%$NbrCol == 1) {
$NbrLigne++;
$fintr = 0;
?> <tr>
<?php }
?> <td>
<?php
echo $tableau[$k];
?> </td>
<?php if (($k+1)%$NbrCol == 0) {
$fintr = 1;
?> </tr>
<?php }
$k++;
}
if ($fintr!=1) {
?> </tr>
<?php } ?>
</tbody>
</table>
<?php
} else { ?>
pas de données à afficher
<?php
}
?>
</body>
</html>
|
IV. Affichage "en ligne" avec Base de Données
Affichage de données récupérées par une requête dans une base de données
- On veut afficher dans chaque cellule 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 "// DONNEES A AFFICHER dans la cellule" : vous affichez ce que vous voulez !
- Afficher plusieurs données,
- Afficher des images,
- Ajouter des liens hypertexte,
- Les organiser selon votre mise en page, dans un tableau,
- ...
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".
Ex. : La table MATABLE :
| ID |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| CHOSE |
banane |
betterave |
boule |
pomme |
ananas |
baie |
bille |
citron |
bonbon |
ballon |
| GENRE |
fruit |
legume |
jouet |
fruit |
fruit |
fruit |
jouet |
fruit |
douceur |
jouet |
La requête (exemple) : toutes les "CHOSE" commençant par un "b", classées par ordre alphabétique.
| _connexion.php |
<?php
$host = "localhost";
$user = "login";
$pass = "password";
$bdd = "MABASE";
@mysql_connect($host,$user,$pass) or die("Impossible de se connecter");
@mysql_select_db("$bdd") or die("Impossible de se connecter");
?>
|
| Affichage en ligne avec Base de Donnees |
<?php include('_connexion.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Affichage en ligne avec Base de Donnees</title>
</head>
<body>
<?php
$NbrCol = 4;
$table = 'MATABLE';
$query = "SELECT * FROM ".$table." WHERE CHOSE LIKE 'b%' ORDER BY CHOSE ASC;";
$result = mysql_query($query);
$NbreData = mysql_num_rows($result);
$NbrLigne = 0;
if ($NbreData != 0) {
$j = 1;
?>
<table border="1">
<tbody>
<?php
while ($val = mysql_fetch_array($result))
{
if ($j%$NbrCol == 1) {
$NbrLigne++;
$fintr = 0;
?> <tr>
<?php }
?>
<td>
<?php
echo $val['CHOSE'];
echo '<br/>';
echo '<i>'.$val['GENRE'].'</i>';
?> </td>
<?php if ($j%$NbrCol == 0) {
$fintr = 1;
?> </tr>
<?php }
$j++;
}
if ($fintr!=1) {
?> </tr>
<?php } ?>
</tbody>
</table>
<?php
} else { ?>
pas de données à afficher
<?php
}
?>
<?php mysql_close();
</body>
</html>
|
V. Affichage "en colonne" avec array()
Les scripts précédents affichent les données "en ligne".
 |
Avec les écrans 16/9e (portable, ...), il devient intéressant d'envisager d'afficher "en colonne"
(hauteur fixe)
--> scroll horizontal (ça change du scroll vertical conventionnel !), donc original !
|
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.
V-A. Affichage "en Colonne" - Solution 1 avec Array()
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..."

| Affichage en colonne avec array() - solution 1 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Affichage en colonne avec array - solution 1</title>
</head>
<body>
<?php
$NbrLigne = 3;
$tableau = array('elt0','elt1','elt2','elt3','elt4','elt5','elt6','elt7','elt8','elt9');
$NbreData = count($tableau);
$NbrCol = 0;
if ($NbreData != 0) {
$k = 0;
?>
<table>
<tbody>
<tr>
<?php
while ($k < $NbreData)
{
?> <td valign="top">
<table border="1">
<?php for ($i=1; $i<=$NbrLigne; $i++) {
if ($k < $NbreData) {
?> <tr>
<td>
<?php
echo $tableau[$k];
?> </td>
</tr>
<?php $k++;
}
if ($i == $NbrLigne) {
?> </table>
</td>
<?php }
}
$NbrCol++;
}
?> </tr>
<tbody>
</table>
<?php
} else {
?> pas de données à afficher
<?php
}
?>
</body>
</html>
|
V-B. Affichage "en Colonne" - Solution 2, avec Array()
La solution 1 est efficace, mais pas satisfaisante si on souhaite aligner "proprement" toutes les cellules.
Cas des cellules dont la hauteur du contenu peut varier (par ex. : avec des images de hauteur variable)
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 :
| ligne 0 : |
elt0 - elt3 - elt6 - elt9 |
0 % 3 = 3 % 3 = 6 % 3 = 9 % 3 = 0 |
| ligne 1 : |
elt1 - elt4 - elt7 |
1 % 3 = 4 % 3 = 7 % 3 = ... = 1 |
| ligne 2 : |
elt2 - elt5 - elt8 |
2 % 3 = 5 % 3 = 8 % 3 = ... = 2 |

| Affichage en colonne avec array() - solution 2 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Affichage en colonne avec array - solution 2</title>
</head>
<body>
<?php
$NbrLigne = 3;
$tableau = array('elt0','elt1','elt2','elt3','elt4','elt5','elt6','elt7','elt8','elt9');
$NbreData = count($tableau);
if ($NbreData != 0) {
$i = 0;
$NbrCol = 0;
?>
<table border="1">
<tbody>
<?php
for ($i=0; $i<$NbrLigne; $i++)
{
?> <tr>
<?php $j = 0;
while (($i+($j*$NbrLigne))%$NbrLigne==$i && ($i+($j*$NbrLigne))<$NbreData)
{
?> <td>
<?php
$k = ($i+($j*$NbrLigne));
echo $tableau[$k];
?> </td>
<?php $j++;
if ($NbrCol<$j) { $NbrCol=$j; }
}
?> </tr>
<?php
}
?>
</tbody>
</table>
<?php
} else {
?> pas de données à afficher
<?php
}
?>
</body>
</html>
|
VI. Affichage "en colonne" avec Base de Données
Le script utilisant les indices de tableau :
- Création d'un tableau array() contenant les données récupérées.
Ex. : La table MATABLE :
| ID |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| CHOSE |
banane |
betterave |
boule |
pomme |
ananas |
baie |
bille |
citron |
bonbon |
ballon |
| GENRE |
fruit |
legume |
jouet |
fruit |
fruit |
fruit |
jouet |
fruit |
douceur |
jouet |
La requête (exemple) : toutes les "CHOSE" commençant par un "b", classées par ordre alphabétique.
VI-A. Affichage "en Colonne" avec BD - Solution 1
| _connexion.php |
<?php
$host = "localhost";
$user = "login";
$pass = "password";
$bdd = "MABASE";
@mysql_connect($host,$user,$pass) or die("Impossible de se connecter");
@mysql_select_db("$bdd") or die("Impossible de se connecter");
?>
|
| Affichage en colonne avec Base de Donnees - solution 1 |
<?php include('_connexion.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Affichage en colonne avec BD - solution 2</title>
</head>
<body>
<?php
$NbrLigne = 4;
$table = 'MATABLE';
$query = "SELECT * FROM ".$table." WHERE CHOSE LIKE 'b%' ORDER BY CHOSE ASC;";
$result = mysql_query($query);
$NbreData = mysql_num_rows($result);
$k=0;
while ($val = mysql_fetch_array($result)) {
$tableau1[$k] = $val['CHOSE'];
$tableau2[$k] = $val['GENRE'];
$k++;
}
if ($NbreData != 0) {
$i = 0;
$NbrCol = 0;
?>
<table border="1">
<tbody>
<?php
for ($i=0; $i<$NbrLigne; $i++) {
?> <tr>
<?php $j = 0;
while (($i+($j*$NbrLigne))%$NbrLigne==$i && ($i+($j*$NbrLigne))<$NbreData)
{
?> <td>
<?php
$k = ($i+($j*$NbrLigne));
echo $tableau1[$k];
echo '<br/>';
echo '<i>'.$tableau2[$k].'</i>';
?> </td>
<?php $j++;
if ($NbrCol<$j) { $NbrCol=$j; }
}
?> </tr>
<?php
}
?>
</tbody>
</table>
<?php
} else {
?> pas de données à afficher
<?php
}
?>
<?php mysql_close();
</body>
</html>
|
VI-C. Affichage "en Colonne" avec BD - Astuce
 |
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.
|
| Affichage en colonne avec array() - solution 2 |
<?php
$k=0;
while ($val = mysql_fetch_array($result)) {
$tableau[$k] = $val;
$k++;
}
$k = ($i+($j*$NbrLigne));
echo $tableau[$k]['CHOSE'];
echo '<br/>';
echo '<i>'.$tableau[$k]['GENRE'].'</i>';
?>
|
VII. Pour aller plus loin : fonctions
Les codes proposés ici sont rédigés en dur dans la page à afficher.
 |
Mais si vous êtes amené à faire des tableaux, de manière répétitives, d'après des besoins spécifiques :
- nombre, type de données à afficher,
- mise en page à appliquer à l'intérieur de la cellule, ...
il est possible d'écrire des fonctions ou procédures externes.
|
il est possible d'écrire des fonctions ou procédures externes.
- CreateHtmlTable(NbrCol,............) : définir les bons paramètres à transmettre à la fonction,
- ' ......... : le code dépend du type d'affichage choisi (cf paragraphes précédents)
- ...affichage... : dépend des critères (cf ci-dessus)
| FONCTIONHtmlTable.php |
<?php
function HtmlTable($NbrCol,............)
{
?>
<table>
<tbody>
<tr>
<?php
?>
<td>
<?php
echo '...$affichage...';
?>
</td>
<?php
?>
</tr>
</tbody>
</table>
<?php
}
?>
|
Et appel de la fonction dans la page :
| page.php |
<?php include("FONCTIONHtmlTable.php"); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>page</title>
</head>
<body>
<?php
$NbrCol = .....;
$monarray = array(.....);
HtmlTable($NbrCol,............);
?>
</body>
</html>
|
VIII. Pagination
IX. Conclusion
Il ne vous reste plus qu'à choisir le mode d'affichage qui vous convient !
Toutes remarques, corrections, ajouts, permettant d'améliorer ou d'étoffer ce tutoriel seront les bienvenus.


Les sources présentées sur cette page sont libres de droits
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ©
2008 Jérôme Réaux. Aucune reproduction,
même partielle, ne peut être faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 €
de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.
Cette page est déposée.