Der vil være mange måder at gøre dette på; nogle teknikker involverer sql for at forberede den dynamiske pivot. Mit uddrag nedenfor vil bruge php til at udføre pivoten.
- Sløjfe gennem resultatsætobjektet med en
foreach()
-- nej, du behøver ikke kalde en hentefunktion for at få adgang til dataene, fordi resultatobjektet kan itereres. - Opret et multidimensionelt grupperingssystem med navne som nøgler på første niveau, derefter subarrays med år som nøgler og værdier som værdier.
- Opret en række unikke år. Min tilgang vil sikre unikhed ved at tildele året som både nøglen og værdien -- fordi arrays ikke kan indeholde duplikerede nøgler, vil værdierne være unikke uden at skulle kalde
array_unique()
senere. - Sorter årene ASC
- Opret en række standardværdier for hvert år. I dette tilfælde tildeler jeg
-
som standardværdi. - Tilføj det bogstavelige ord
name
foran i arrayet, der indeholder unikke årstal -- dette vil blive brugt til at udfylde tabellens overskriftsrække. - Jeg foretrækker at bruge
implode()
at lave en tabelrække med variabel celler. printf()
er en ren måde at blande bogstavelig tekst med variabler -- den undgår interpolation/sammenkædningssyntaks.- I hver efterfølgende tabelrække skal du erstatte de årlige standardværdier med den relative persons årlige værdier og præsenteres med
implode()
. - Hvis der er nogen chance for, at resultatsættet er tomt, vil du måske pakke det meste af dette uddrag i en
if ($resultObject) { ... }
blokere.
Kode:(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>";
Output:(med tilføjet mellemrum/tabulering for lettere 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>