Bude mnoho způsobů, jak toho dosáhnout; některé techniky zahrnují sql k přípravě dynamického pivotu. Můj úryvek níže použije k provedení pivotování php.
- Procházejte objekt sady výsledků pomocí
foreach()
-- Ne, pro přístup k datům nemusíte volat funkci načítání, protože výsledný objekt je iterovatelný. - Vytvořte vícerozměrné seskupovací pole s názvy jako klíči první úrovně a poté s podpolemi s roky jako klíči a hodnotami jako hodnotami.
- Vytvořte řadu jedinečných let. Můj přístup zajistí jedinečnost přiřazením roku jako klíče i hodnoty – protože pole nemohou obsahovat duplicitní klíče, hodnoty budou jedinečné, aniž by bylo nutné volat
array_unique()
později. - Seřaďte roky ASC
- Vytvořte pole výchozích hodnot pro každý rok. V tomto případě přiděluji
-
jako výchozí hodnotu. - Přidejte doslovné slovo
name
na začátek pole obsahujícího jedinečné roky -- to bude použito k vyplnění řádku záhlaví tabulky. - Raději používám
implode()
k vytvoření řádku tabulky s proměnnými buňkami. printf()
je čistý způsob prolnutí doslovného textu s proměnnými – vyhýbá se syntaxi interpolace/řetězení.- V každém následujícím řádku tabulky nahraďte výchozí roční hodnoty ročními hodnotami příslušné osoby a uveďte je pomocí
implode()
. - Pokud existuje možnost, že sada výsledků je prázdná, můžete většinu tohoto úryvku zabalit do
if ($resultObject) { ... }
blokovat.
Kód:(Ukázka )
$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>";
Výstup:(s přidanými mezerami/tabulátorem pro snadnější čtení)
<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>