Sẽ có nhiều cách để làm điều này; một số kỹ thuật liên quan đến sql để chuẩn bị trục xoay động. Đoạn mã của tôi bên dưới sẽ sử dụng php để thực hiện xoay.
- Lặp qua đối tượng tập kết quả bằng
foreach()
- không, bạn không cần gọi hàm tìm nạp để truy cập dữ liệu vì đối tượng kết quả có thể lặp lại. - Tạo mảng nhóm nhiều chiều với tên là khóa cấp đầu tiên, sau đó là các mảng con với năm là khóa và giá trị là giá trị.
- Tạo một loạt các năm duy nhất. Cách tiếp cận của tôi sẽ đảm bảo tính duy nhất bằng cách chỉ định năm làm cả khóa và giá trị - bởi vì các mảng không thể chứa các khóa trùng lặp, các giá trị sẽ là duy nhất mà không cần phải gọi
array_unique()
sau. - Sắp xếp các năm theo ASC
- Tạo một mảng các giá trị mặc định cho hàng năm. Trong trường hợp này, tôi đang gán
-
làm giá trị mặc định. - Thêm từ theo nghĩa đen
name
ở phía trước của mảng chứa các năm duy nhất - điều này sẽ được sử dụng để điền vào hàng tiêu đề của bảng. - Tôi thích sử dụng
implode()
để tạo một hàng trong bảng có ô thay đổi. -
printf()
là một cách dễ dàng để trộn văn bản theo nghĩa đen với các biến - nó tránh cú pháp nội suy / nối. - Trong mỗi hàng bảng tiếp theo, thay thế các giá trị hàng năm mặc định bằng các giá trị hàng năm của người tương đối và hiển thị bằng
implode()
. - Nếu có bất kỳ khả năng nào mà tập hợp kết quả trống, thì bạn có thể muốn bọc phần lớn đoạn mã này trong một
if ($resultObject) { ... }
khối.
Mã:( 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>";
Đầu ra:(có thêm khoảng cách / tab để đọc dễ dàng hơn)
<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>