1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| <style>
table {
border-collapse: collapse;
margin-bottom: 0;
width: 500px;
text-align: left;
font-family: Verdana, Arial, Tahoma, Calibri, Geneva, sans-serif;
font-size: 13px;
}
tr {vertical-align: top;}
td {
border: 3px solid #999999;
padding: 0.5em;
margin: 0;
}
</style>
<?php
// Les données.
$original = [
"1 à 49" => [
"6.000" => ["10 ans", "12 ans", "16 ans"],
"5.000" => ["6 ans", "8 ans"],
],
"50 à 99" => [
"5.980" => ["12 ans", "16 ans"],
"4.980" => ["6 ans", "8 ans", "10 ans"],
],
/*"extra test" => [
"4.950" => ["8 ans", "10 ans"],
"5.990" => ["6 ans", "12 ans", "16 ans"],
],*/
];
// changer l'ordre des niveaux pour simplifier l'affichage du tableau HTML
$transpose = [];
foreach($original as $taille => $montants) {
foreach($montants as $montant => $ages) {
foreach($ages as $age) {
$transpose[$age][$taille] = $montant;
}
}
}
// afficher le tableau HTML en regroupant les prix identiques, le 10 ans sera sur le premier <tr> et non le dernier. Acceptable ?
$format_prix = str_repeat('<td>%01.2f </td>', count($original)); // au cas où il y aurait + ou - que 2 colonnes pour Tailles
$format_entete = str_repeat('<td>%s</td>', count($original)); // idem
vprintf("<table><tr><td>Tailles</td>$format_entete</tr>", array_keys($original));
$ligne = $precedent = [];
foreach($transpose as $age => $ages) {
$check = array_values($ages); // extraire les prix courants
// si les prix précédents sont différent des prix courants
if($check !== $precedent) {
// s'il y a une ligne <tr> en attente d'affichage, alors l'afficher.
if(!empty($ligne)) vprintf("<tr><td>%s</td>$format_prix</tr>", $ligne);
$ligne = array_merge([$age], $check); // construire la nouvelle ligne en attente d'affichage (regrouper âges)
$precedent = $check; // les prix courants deviennent les prix précédents
}
// sinon, ajouter l'âge actuel pour la case des âges (regrouper)
else $ligne[0] .= "<br>$age";
}
// il reste à afficher la dernière ligne <tr> en attente et fermer </table>, obligé sauf si $orginal peut-être vide.
vprintf("<tr><td>%s</td>$format_prix</tr></table>", $ligne); |
Partager