首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >支点mysql结果集并创建html表/矩阵

支点mysql结果集并创建html表/矩阵
EN

Stack Overflow用户
提问于 2020-09-09 05:56:33
回答 4查看 1.2K关注 0票数 3

整晚我的头都靠在墙上,但还没有解决办法,比如说我有这样的Mysql表格结构:

代码语言:javascript
复制
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和一年应该是动态的,因为它将随着时间的推移而增加。请给我说明一下该怎么做,谢谢

代码语言:javascript
复制
year |2018 |2019|2020
----------------------
Tom  |  15 |  4 | 6
----------------------
Kate |  18 | 20 | ---

----- and so on --- 

我的代码:

代码语言:javascript
复制
<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>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-09-09 11:33:37

有很多方法可以做到这一点;有些技术涉及到sql来准备动态支点。下面的代码片段将使用php执行支点。

  1. 用一个foreach()循环结果集对象--不,您不需要调用一个获取函数来访问数据,因为结果对象是可迭代的。
  2. 创建一个以名称作为第一级键的多维分组数组,然后以年份作为键和值作为值的子数组。
  3. 创建一个独特年份的数组。我的方法将确保唯一性,将年份指定为键和值--因为数组不能包含重复的键,因此值将是唯一的,而不必稍后调用array_unique()
  4. 对ASC年进行排序
  5. 为每年创建一个默认值数组。在本例中,我将-赋值为默认值。
  6. 将文字单词name添加到包含唯一年份的数组的前面--这将用于填充表的标题行。
  7. 我更喜欢使用implode()来创建一个可变单元格的表行。
  8. printf()是一种将文字文本与变量混合的干净方法--它避免了内插/级联语法。
  9. 在随后的每个表行中,用相对人的年值替换默认值,并以implode()表示。
  10. 如果有任何可能结果集是空的,那么您可能想要将大部分这个片段包装在一个if ($resultObject) { ... }块中。

代码:(演示)

代码语言:javascript
复制
$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>";

输出:(增加间距/标签以便于阅读)

代码语言:javascript
复制
<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>
票数 1
EN

Stack Overflow用户

发布于 2020-09-09 06:38:01

请看下面的代码可以帮助您找到解决方案:

基本上,需要额外的一个输入数据循环来创建输出数据所需的元数据。在一些数据报告场景中,这种数据转换是必需的。

代码语言:javascript
复制
<?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)的输出:

代码语言:javascript
复制
    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)
  }
}
票数 1
EN

Stack Overflow用户

发布于 2020-09-09 07:54:10

首先,您需要有一个单独的查询,该查询以升序顺序获取所有年份。

代码语言:javascript
复制
'SELECT year FROM table GROUP BY year ORDER BY year ASC

或者从结果数组中提取年份,如下面循环中注释掉的那样,但要确保在主查询中按年份对ASC进行排序,以避免两次调用数据库。

你应该有这样的结果。在foreach循环中操作数组,它将按用户给出多维数组。

然后在html中循环它,如下面的代码所示,您应该这样做。

代码语言:javascript
复制
   <?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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63805519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档