Det kommer att finnas många sätt att göra detta på; vissa tekniker involverar sql för att förbereda den dynamiska pivoten. Mitt utdrag nedan kommer att använda php för att utföra pivoten.
- Slinga genom resultatuppsättningsobjektet med en
foreach()
-- nej, du behöver inte anropa en hämtningsfunktion för att komma åt data eftersom resultatobjektet är iterbart. - Skapa en flerdimensionell grupperingsmatris med namn som nycklar på första nivån, sedan subarrayer med årtal som nycklar och värden som värden.
- Skapa en rad unika år. Mitt tillvägagångssätt kommer att säkerställa unikhet genom att tilldela året som både nyckel och värde -- eftersom arrayer inte kan innehålla dubblerade nycklar, kommer värdena att vara unika utan att behöva anropa
array_unique()
senare. - Sortera åren ASC
- Skapa en uppsättning standardvärden för varje år. I det här fallet tilldelar jag
-
som standardvärde. - Lägg till det bokstavliga ordet
name
längst fram i arrayen som innehåller unika årtal -- detta kommer att användas för att fylla i rubrikraden i tabellen. - Jag föredrar att använda
implode()
för att skapa en tabellrad med variabel cell. printf()
är ett rent sätt att blanda bokstavlig text med variabler -- det undviker interpolations-/konkateneringssyntax.- I varje efterföljande tabellrad, ersätt de årliga standardvärdena med den relativa personens årliga värden och presentera med
implode()
. - Om det finns någon chans att resultatuppsättningen är tom, kanske du vill slå in det mesta av detta utdrag i en
if ($resultObject) { ... }
blockera.
Kod:(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>";
Utdata:(med extra mellanrum/flikar för enklare läsning)
<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>