Es wird viele Möglichkeiten geben, dies zu tun; Einige Techniken beinhalten SQL, um den dynamischen Pivot vorzubereiten. Mein Snippet unten verwendet PHP, um den Pivot durchzuführen.
- Durchlaufen Sie das Ergebnismengenobjekt mit einem
foreach()
-- nein, Sie müssen keine Abruffunktion aufrufen, um auf die Daten zuzugreifen, da das Ergebnisobjekt iterierbar ist. - Erstellen Sie ein mehrdimensionales Gruppierungsarray mit Namen als Schlüssel der ersten Ebene, dann Subarrays mit Jahren als Schlüssel und Werten als Werten.
- Erstellen Sie eine Reihe eindeutiger Jahreszahlen. Mein Ansatz stellt die Eindeutigkeit sicher, indem er das Jahr sowohl als Schlüssel als auch als Wert zuweist – da Arrays keine doppelten Schlüssel enthalten können, sind die Werte eindeutig, ohne dass
array_unique()
aufgerufen werden muss später. - Sortieren Sie die Jahreszahlen ASC
- Erstellen Sie ein Array von Standardwerten für jedes Jahr. In diesem Fall weise ich
-
zu als Standardwert. - Fügen Sie das wörtliche Wort
name
hinzu an den Anfang des Arrays, das eindeutige Jahreszahlen enthält -- dies wird verwendet, um die Kopfzeile der Tabelle zu füllen. - Ich bevorzuge die Verwendung von
implode()
um eine Tabellenzeile mit variablen Zellen zu erstellen. printf()
ist ein sauberer Weg, wörtlichen Text mit Variablen zu verschmelzen – es vermeidet Interpolations-/Verkettungssyntax.- Ersetzen Sie in jeder nachfolgenden Tabellenzeile die Standardjahreswerte durch die Jahreswerte der entsprechenden Person und präsentieren Sie sie mit
implode()
. - Wenn die Möglichkeit besteht, dass die Ergebnismenge leer ist, sollten Sie den größten Teil dieses Ausschnitts in ein
if ($resultObject) { ... }
einschließen blockieren.
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>";
Ausgabe:(mit zusätzlichem Abstand/Tabulator zum leichteren Lesen)
<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>