Ci saranno molti modi per farlo; alcune tecniche coinvolgono sql per preparare il pivot dinamico. Il mio snippet di seguito utilizzerà php per eseguire il pivot.
- Scorri l'oggetto set di risultati con un
foreach()
-- no, non è necessario chiamare una funzione di recupero per accedere ai dati perché l'oggetto risultato è iterabile. - Crea un array di raggruppamento multidimensionale con nomi come chiavi di primo livello, quindi sottoarray con anni come chiavi e valori come valori.
- Crea una serie di anni unici. Il mio approccio garantirà l'unicità assegnando l'anno sia come chiave che come valore -- poiché gli array non possono contenere chiavi duplicate, i valori saranno univoci senza dover chiamare
array_unique()
dopo. - Ordina gli anni ASC
- Crea una matrice di valori predefiniti per ogni anno. In questo caso, sto assegnando
-
come valore predefinito. - Aggiungi la parola letterale
name
all'inizio dell'array contenente anni univoci:verrà utilizzato per popolare la riga di intestazione della tabella. - Preferisco usare
implode()
per creare una riga di tabella a celle variabili. printf()
è un modo pulito per fondere il testo letterale con le variabili -- evita la sintassi di interpolazione/concatenazione.- In ogni riga successiva della tabella, sostituisci i valori annuali predefiniti con i valori annuali della persona relativa e presenta con
implode()
. - Se è possibile che il set di risultati sia vuoto, potresti voler racchiudere la maggior parte di questo snippet in un
if ($resultObject) { ... }
blocco.
Codice:(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:(con spaziatura/tabulazioni aggiunte per una lettura più facile)
<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>