Er zullen veel manieren zijn om dit te doen; sommige technieken hebben betrekking op sql om de dynamische spil voor te bereiden. Mijn fragment hieronder gebruikt php om de spil uit te voeren.
- Loop door het resultaatset-object met een
foreach()
-- nee, u hoeft geen ophaalfunctie aan te roepen om toegang te krijgen tot de gegevens, omdat het resultaatobject itereerbaar is. - Maak een multidimensionale groeperingsmatrix met namen als de sleutels op het eerste niveau en vervolgens subarrays met jaren als sleutels en waarden als waarden.
- Maak een reeks unieke jaren. Mijn aanpak zorgt voor uniciteit door het jaar toe te wijzen als zowel de sleutel als de waarde -- omdat arrays geen dubbele sleutels kunnen bevatten, zullen de waarden uniek zijn zonder dat je
array_unique()
hoeft aan te roepen later. - Sorteer de jaren ASC
- Maak een reeks standaardwaarden voor elk jaar. In dit geval wijs ik
-
. toe als de standaardwaarde. - Voeg het letterlijke woord
name
toe aan de voorkant van de array met unieke jaren -- dit wordt gebruikt om de koprij van de tabel te vullen. - Ik gebruik liever
implode()
om een tabelrij met variabele cellen te maken. printf()
is een schone manier om letterlijke tekst te mengen met variabelen -- het vermijdt interpolatie/aaneenschakeling syntaxis.- Vervang in elke volgende tabelrij de standaard jaarwaarden door de jaarwaarden van de relatieve persoon en presenteer met
implode()
. - Als de kans bestaat dat de resultatenset leeg is, wilt u misschien het grootste deel van dit fragment in een
if ($resultObject) { ... }
plaatsen blok.
Code:(Demo )
$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>";
Uitvoer:(met extra spatiëring/tabbladen voor gemakkelijker lezen)
<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>