Il y aura de nombreuses façons de le faire; certaines techniques impliquent sql pour préparer le pivot dynamique. Mon extrait ci-dessous utilisera php pour effectuer le pivot.
- Parcourir l'objet de l'ensemble de résultats avec un
foreach()
-- non, vous n'avez pas besoin d'appeler une fonction de récupération pour accéder aux données car l'objet de résultat est itérable. - Créez un tableau de regroupement multidimensionnel avec des noms comme clés de premier niveau, puis des sous-tableaux avec des années comme clés et des valeurs comme valeurs.
- Créez un tableau d'années uniques. Mon approche garantira l'unicité en attribuant l'année à la fois à la clé et à la valeur - car les tableaux ne peuvent pas contenir de clés dupliquées, les valeurs seront uniques sans avoir à appeler
array_unique()
plus tard. - Trier les années ASC
- Créez un tableau de valeurs par défaut pour chaque année. Dans ce cas, j'attribue
-
comme valeur par défaut. - Ajouter le mot littéral
name
au début du tableau contenant des années uniques -- ceci sera utilisé pour remplir la ligne d'en-tête du tableau. - Je préfère utiliser
implode()
pour créer une ligne de tableau à cellules variables. printf()
est un moyen propre de mélanger du texte littéral avec des variables - cela évite la syntaxe d'interpolation/concaténation.- Dans chaque ligne suivante du tableau, remplacez les valeurs annuelles par défaut par les valeurs annuelles de la personne relative et présentez-les avec
implode()
. - S'il y a une chance que le jeu de résultats soit vide, alors vous voudrez peut-être envelopper la majeure partie de cet extrait dans un
if ($resultObject) { ... }
bloquer.
Code :(Démo )
$grouped = [];
$columns = [];
$resultObject = $mysqli->query("SELECT `name`, `value`, `year` FROM `Testab`");
foreach ($resultObject as $row) {
$grouped[$row['name']][$row['year']] = $row['value'];
$columns[$row['year']] = $row['year'];
}
sort($columns);
$defaults = array_fill_keys($columns, '-');
array_unshift($columns, 'name');
echo "<table>";
printf(
'<tr><th>%s</th></tr>',
implode('</th><th>', $columns)
);
foreach ($grouped as $name => $records) {
printf(
'<tr><td>%s</td><td>%s</td></tr>',
$name,
implode('</td><td>', array_replace($defaults, $records))
);
}
echo "</table>";
Sortie :(avec espacement/tabulation ajouté pour une lecture plus facile)
<table>
<tr>
<th>name</th> <th>2018</th> <th>2019</th> <th>2020</th>
</tr>
<tr>
<td>Tom</td> <td>15</td> <td>4</td> <td>6</td>
</tr>
<tr>
<td>Kate</td> <td>18</td> <td>20</td> <td>-</td>
</tr>
</table>