Ще има много начини да направите това; някои техники включват sql за подготовка на динамичната опора. Моят фрагмент по-долу ще използва php за извършване на въртене.
- Прегледайте обекта на набора от резултати с
foreach()
-- не, не е необходимо да извикате функция за извличане, за да получите достъп до данните, тъй като резултатният обект е итерируем. - Създайте многоизмерен групиращ масив с имена като ключове от първо ниво, след това подмасиви с години като ключове и стойности като стойности.
- Създайте масив от уникални години. Моят подход ще гарантира уникалност, като присвоява годината и като ключ, и като стойност - тъй като масивите не могат да съдържат дублирани ключове, стойностите ще бъдат уникални, без да се налага да се извиква
array_unique()
по-късно. - Сортиране на годините ASC
- Създайте масив от стойности по подразбиране за всяка година. В този случай присвоявам
-
като стойност по подразбиране. - Добавете буквалната дума
name
в предната част на масива, съдържащ уникални години – това ще се използва за попълване на заглавния ред на таблицата. - Предпочитам да използвам
implode()
за да създадете ред на таблица с променливи клетки. printf()
е чист начин за смесване на буквален текст с променливи - избягва синтаксиса на интерполация/конкатенация.- Във всеки следващ ред на таблицата заменете годишните стойности по подразбиране с годишните стойности на съответното лице и ги представете с
implode()
. - Ако има някакъв шанс резултатният набор да е празен, тогава може да искате да обвиете по-голямата част от този фрагмент в
if ($resultObject) { ... }
блок.
Код:(Демо )
$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>";
Изход:(с добавено разстояние/табулация за по-лесно четене)
<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>