整晚我的头都靠在墙上,但还没有解决办法,比如说我有这样的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 --- 我的代码:
<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>发布于 2020-09-09 11:33:37
有很多方法可以做到这一点;有些技术涉及到sql来准备动态支点。下面的代码片段将使用php执行支点。
foreach()循环结果集对象--不,您不需要调用一个获取函数来访问数据,因为结果对象是可迭代的。array_unique()。-赋值为默认值。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>发布于 2020-09-09 06:38:01
请看下面的代码可以帮助您找到解决方案:
基本上,需要额外的一个输入数据循环来创建输出数据所需的元数据。在一些数据报告场景中,这种数据转换是必需的。
<?PHP
//assuming mysql is giving below data
$in_data = array(
array('ID'=>1,'name'=>'Tom','value'=>15,'year'=>2018),
array('ID'=>2,'name'=>'Tom','value'=>4,'year'=>2019),
array('ID'=>3,'name'=>'Tom','value'=>6,'year'=>2020),
array('ID'=>4,'name'=>'Kate','value'=>18,'year'=>2018),
array('ID'=>5,'name'=>'Kate','value'=>20,'year'=>2019),
);
$out_data = convertInToOut($in_data);
var_dump($out_data);
function convertInToOut($inData){
$years = array();
$persons = array('year'=>array('name'));
//creating meta data
foreach($inData as $in){
$years[$in['year']] = $in['year'];
$persons[$in['name']] = array($in['name']);
}
sort($years,SORT_NUMERIC);
//aligning based on year
$yearIndex = array();
foreach($years as $key=>$year){
$yearIndex[$year] = $key;
$persons['year'][] = $year;
}
//final step of handling values for each names
foreach($inData as $in){
$persons[$in['name']][$yearIndex[$in['year']]+1] = $in['value'];
}
return $persons;
}
?>var_dump($out_data)的输出:
array(3) {
["year"]=>
array(4) {
[0]=>
string(4) "name"
[1]=>
int(2018)
[2]=>
int(2019)
[3]=>
int(2020)
}
["Tom"]=>
array(4) {
[0]=>
string(3) "Tom"
[1]=>
int(15)
[2]=>
int(4)
[3]=>
int(6)
}
["Kate"]=>
array(3) {
[0]=>
string(4) "Kate"
[1]=>
int(18)
[2]=>
int(20)
}
}发布于 2020-09-09 07:54:10
首先,您需要有一个单独的查询,该查询以升序顺序获取所有年份。
'SELECT year FROM table GROUP BY year ORDER BY year ASC或者从结果数组中提取年份,如下面循环中注释掉的那样,但要确保在主查询中按年份对ASC进行排序,以避免两次调用数据库。
你应该有这样的结果。在foreach循环中操作数组,它将按用户给出多维数组。
然后在html中循环它,如下面的代码所示,您应该这样做。
<?php
$mydata = array(
array(
'id' => 1,
'name' => 'Tom',
'value' => 5,
'year' => 2019
),
array(
'id' => 1,
'name' => 'Tom',
'value' => 5,
'year' => 2018
),
array(
'id' => 1,
'name' => 'kate',
'value' => 5,
'year' => 2017
),
array(
'id' => 1,
'name' => 'Tom',
'value' => 5,
'year' => 2018
),
array(
'id' => 1,
'name' => 'kate',
'value' => 5,
'year' => 2018
),
array(
'id' => 1,
'name' => 'kate',
'value' => 5,
'year' => 2017
),
array(
'id' => 1,
'name' => 'joe',
'value' => 5,
'year' => 2016
),
array(
'id' => 1,
'name' => 'joe',
'value' => 5,
'year' => 2017
)
);
//this line assumes that you queries the database to fetch the years
$years = ['2019','2018','2017','2016'];
$display = array();
foreach ($mydata as $data) {
//only add this if you don't want to query the database a second
//time to get the years
if(!in_array($data['year'], $years)){
$years[] = $data['year'];
}
$display[$data['name']]['values'][$data['year']] = $data['value'];
$display[$data['name']]['name'] = $data['name'];
}
?>
<html>
<body>
<table>
<td>year</td>
<?php foreach ( $years as $year) { ?>
<td><?php echo $year; ?></td>
<?php } ?>
<tbody>
<?php foreach ($display as $name => $info) { ?>
<tr>
<td><?php echo $info['name']; ?></td>
<?php foreach($years as $year){ ?>
<td><?php echo isset($info['values'][$year])? $info['values'][$year] : 'null'; ?></td>
<?php } ?>
</tr>
<?php } ?>
</tbody>
</th>
</table>
</body>
</html>https://stackoverflow.com/questions/63805519
复制相似问题