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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| <?php
$sql = <<<'SQL'
SELECT
nom_profession,
nom_pays,
SUM(tot_stat) AS nbTotal
FROM pays
INNER JOIN stat_pays_profession ON pays.num_pays = stat_pays_profession.num_pays
INNER JOIN profession ON stat_pays_profession.num_profession = profession.num_profession
GROUP BY
nom_profession,
nom_pays
ORDER BY
nom_profession,
nom_pays
SQL;
$exec = mysql_query($sql);
if ( ! $exec) {
die ('sql error = ' . mysql_error());
}
$data = array();
$prof = array();
$pays = array();
while($row = mysql_fetch_assoc($exec)) {
$data[] = $row;
// on récupère de manière unique la liste des professions et des pays
$prof[$row['nom_profession']] = null;
$pays[$row['nom_pays']] = null;
}
$prof = array_flip($prof); // inversion clé-valeur
$pays = array_flip($pays); // inversion clé-valeur
$nbPays = count($pays);
$nbData = count($data);
sort($pays); // tri des pays par ordre alphabétique (les professions sont déjà triées par le sql)
$webFormat = array(); // représente le tableau de données final
$webRow = array(); // représente une ligne de données numériques du tableau final
$iData = 0; // curseur de départ pour la lecture du tableau $data (on le modifiera afin de ne pas parcourir à chaque fois des données déjà traitées)
// pour chaque profession
foreach($prof as $profession) {
// on rempli la ligne de rendu avec des valeurs nulles (dans le cas où il n'y aurait pas de données pour un pays)
$webRow = array_fill(0, $nbPays, null);
// on parcourt le tableau des données rattachées à la profession
for($i = $iData; $i < $nbData; ++$i) {
// si la profession dans le tableau de données ne correspond plus à la profession en cours de traitement,
// on s'arrête et on modifie le curseur iData pour la prochaine itération (profession suivante)
if ($details[$i]['nom_profession'] !== $profession) {
$iData = $i;
break;
}
// sinon on recherche le n° de colonne du pays
$posPays = array_search($details[$i]['nom_pays'], $pays, true);
// enregistrement de la valeur statistique à l'intersection profession/pays
$webRow[$posPays] = $details[$i]['nbTotal'];
}
$webFormat[$profession] = $webRow;
}
// fonction de sécurisation des données à afficher
$hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES); };
?>
<table>
<thead>
<tr>
<th> </th>
<?php foreach($pays as $value): ?>
<th><?php echo $hsc($value); ?></th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach($webFormat as $profession => $webRow): ?>
<tr>
<td><?php echo $hsc($profession); ?></td>
<?php foreach($webRow as $nbTotal): ?>
<td><?php echo $nbTotal; ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table> |
Partager