Będzie na to wiele sposobów; niektóre techniki wymagają sql do przygotowania dynamicznego obrotu. Mój fragment poniżej użyje php do wykonania osi.
- Przejdź w pętlę przez obiekt zestawu wyników za pomocą
foreach()
-- nie, nie musisz wywoływać funkcji pobierającej, aby uzyskać dostęp do danych, ponieważ obiekt wynikowy jest iterowalny. - Utwórz wielowymiarową tablicę grupującą z nazwami jako kluczami pierwszego poziomu, a następnie podtablicami z latami jako kluczami i wartościami jako wartościami.
- Utwórz tablicę unikalnych lat. Moje podejście zapewni unikatowość, przypisując rok zarówno jako klucz, jak i jako wartość — ponieważ tablice nie mogą zawierać zduplikowanych kluczy, wartości będą unikalne bez konieczności wywoływania funkcji
array_unique()
później. - Posortuj lata ASC
- Utwórz tablicę wartości domyślnych dla każdego roku. W tym przypadku przypisuję
-
jako wartość domyślna. - Dodaj dosłowne słowo
name
na początku tablicy zawierającej unikalne lata -- będzie to użyte do wypełnienia wiersza nagłówka tabeli. - Wolę używać
implode()
aby utworzyć wiersz tabeli o zmiennych komórkach. printf()
to czysty sposób na mieszanie dosłownego tekstu ze zmiennymi -- unika składni interpolacji/konkatenacji.- W każdym kolejnym wierszu tabeli zastąp domyślne wartości roczne wartościami rocznymi względnej osoby i zaprezentuj
implode()
. - Jeśli istnieje jakakolwiek szansa, że zestaw wyników jest pusty, możesz chcieć umieścić większość tego fragmentu w
if ($resultObject) { ... }
blokować.
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>";
Dane wyjściowe:(z dodanymi odstępami / tabulatorami dla łatwiejszego czytania)
<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>