Akan ada banyak cara untuk melakukan ini; beberapa teknik melibatkan sql untuk menyiapkan pivot dinamis. Cuplikan saya di bawah ini akan menggunakan php untuk melakukan pivot.
- Melewati objek kumpulan hasil dengan
foreach()
-- tidak, Anda tidak perlu memanggil fungsi pengambilan untuk mengakses data karena objek hasil dapat diubah. - Buat larik pengelompokan multidimensi dengan nama sebagai kunci tingkat pertama, lalu subarray dengan tahun sebagai kunci dan nilai sebagai nilai.
- Buat rangkaian tahun yang unik. Pendekatan saya akan memastikan keunikan dengan menetapkan tahun sebagai kunci dan nilai -- karena array tidak dapat berisi kunci duplikat, nilainya akan unik tanpa harus memanggil
array_unique()
nanti. - Urutkan tahun ASC
- Buat larik nilai default untuk setiap tahun. Dalam hal ini, saya menetapkan
-
sebagai nilai default. - Tambahkan kata literal
name
ke depan larik yang berisi tahun unik -- ini akan digunakan untuk mengisi baris header tabel. - Saya lebih suka menggunakan
implode()
untuk membuat baris tabel bersel variabel. printf()
adalah cara yang bersih untuk memadukan teks literal dengan variabel -- ini menghindari sintaks interpolasi/penggabungan.- Di setiap baris tabel berikutnya, ganti nilai tahunan default dengan nilai tahunan orang relatif dan sajikan dengan
implode()
. - Jika ada kemungkinan bahwa kumpulan hasil kosong, maka Anda mungkin ingin membungkus sebagian besar cuplikan ini dalam
if ($resultObject) { ... }
blokir.
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:(dengan tambahan spasi/tabbing untuk membaca lebih mudah)
<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>