我整晚都把头撞在墙上,但还没有解决方案,假设我有这样的 Mysql 表结构:
ID name value year
1 Tom 15 2018
2 Tom 4 2019
3 Tom 6 2020
4 Kate 18 2018
5 Kate 20 2019
...and so on...
我想通过 PHP 打印如下结果,年份应该是动态的,因为它会随着时间的推移而增加。请告诉我什么是一种方法谢谢
year |2018 |2019|2020
----------------------
Tom | 15 | 4 | 6
----------------------
Kate | 18 | 20 | ---
----- and so on ---
my code:
<table>
<?php
$mysqli = new mysqli('localhost', 'root', '123', 'news');
$report = array();
$columnIndex = 0;
$query = $mysqli->query("SELECT name, value, year FROM Testab");
while ($results = $query->fetch_assoc()) {
foreach ($results as $tos => $toa) {
$report[$tos][$columnIndex] = $toa;
}
$columnIndex++;
}
foreach ($report as $tos => $results) { ?>
<tr>
<th><?php echo $tos; ?></th>
<?php foreach ($results as $toa) { ?>
<th><?php echo $toa; ?></th>
<?php } ?>
</tr>
<?php } ?>
</table>
有很多方法可以做到这一点;一些技术涉及 SQL 来准备动态数据透视表。我下面的代码片段将使用 php 来执行数据透视。
- 使用 a 循环遍历结果集对象
foreach()
-- 不,您不需要调用获取函数来访问数据,因为结果对象是可迭代的。
- 创建一个多维分组数组,其中名称作为第一级键,然后创建以年份作为键、值作为值的子数组。
- 创造一系列独特的年份。我的方法将通过将年份指定为键和值来确保唯一性 - 因为数组不能包含重复的键,所以值将是唯一的,而无需调用
array_unique()
later.
- 对年份进行 ASC 排序
- 为每年创建一个默认值数组。在这种情况下,我分配
-
作为默认值。
- 添加字面意思
name
到包含唯一年份的数组的前面——这将用于填充表的标题行。
- 我更喜欢使用
implode()
制作可变单元格的表格行。
-
printf()
是一种将文字文本与变量混合的干净方法——它避免了插值/连接语法。
- 在每个后续表行中,将默认年度值替换为相关人员的年度值,并显示为
implode()
.
- 如果结果集有可能为空,那么您可能需要将此片段的大部分内容包装在
if ($resultObject) { ... }
block.
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>";
输出:(添加了间距/制表符以便于阅读)
<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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)