通过 fputcsv 以 CSV 格式订购数据库数据
Order Database Data in a CSV via fputcsv
我想以 CSV 格式从我的数据库获取数据。我的问题是数据没有排序。在我的 CSV 中只有一行数据。
我希望每一天都有自己的专栏,每小时都有自己的行。
像这样:
-|1|2|3|4|5|6| *DAYS*
0|_|_|_|_|_|_|
1|_|_|_|_|_|_|
2|_|_|_|_|_|_|
3|_|_|_|_|_|_|
4|_|_|_|_|_|_|
5|_|_|_|_|_|_|
我的代码是这样的:
$handle = fopen($filename, 'w');
fputcsv($handle, ['customer_id', 'count', 'year', 'month', 'day', 'hour']);
foreach ($table as $row) {
fputcsv($handle, [$row['customer_id'], $row['count'], $row['year'], $row['month'], $row['day'], $row['hour']]);
}
我已经修改了你的代码。我添加了一个预处理步骤,它创建了一个包含索引 $hour 和 $day ($ymd) 的查找 table。我希望它有效,我没有测试它。无论如何它应该给你一个想法。
$days = array();
$hours= array();
$ymds = array();
foreach ($table as $row) {
if(strlen($row['month'])<2) $row['month'] = "0{$row['month']}";
if(strlen($row['day'])<2) $row['day'] = "0{$row['day']}";
$ymd = "{$row['year']}-{$row['month']}-{$row['day']}";
$hour = $row['hour'];
$count = $row['count'];
if(!isset($ymds[$hour]) $ymds[$hour] = array() ;
if(!isset($ymds[$hour][$ymd]) $ymds[$hour][$ymd] = 0;
$ymds[$hour][$ymd] += $count;
$days[$ymd]= $ymd;
$hours[$hour]= $hour;
}
unset($row);
$handle = fopen($filename, 'w');
fputcsv($handle, $days);
foreach ($hours as $hour) {
$row = array();
foreach ($days as $ymd) {
$column = isset($ymds[$hour][$ymd]) ? $ymds[$hour][$ymd] : 0;
$row[] = $column;
}
fputcsv($handle, $row);
}
您的代码应该如下所示。
$filename = 'file.csv';
header( "Content-Type: text/csv;charset=utf-8" );
header( "Content-Disposition: attachment;filename=\"$filename\"" );
header("Pragma: no-cache");
header("Expires: 0");
$fp= fopen('php://output', 'w');
$header = array('customer_id', 'count', 'year', 'month', 'day', 'hour');
fputcsv($fp, $header);
foreach ($table as $row) {
fputcsv($fp, $row);
}
我想以 CSV 格式从我的数据库获取数据。我的问题是数据没有排序。在我的 CSV 中只有一行数据。
我希望每一天都有自己的专栏,每小时都有自己的行。
像这样:
-|1|2|3|4|5|6| *DAYS*
0|_|_|_|_|_|_|
1|_|_|_|_|_|_|
2|_|_|_|_|_|_|
3|_|_|_|_|_|_|
4|_|_|_|_|_|_|
5|_|_|_|_|_|_|
我的代码是这样的:
$handle = fopen($filename, 'w');
fputcsv($handle, ['customer_id', 'count', 'year', 'month', 'day', 'hour']);
foreach ($table as $row) {
fputcsv($handle, [$row['customer_id'], $row['count'], $row['year'], $row['month'], $row['day'], $row['hour']]);
}
我已经修改了你的代码。我添加了一个预处理步骤,它创建了一个包含索引 $hour 和 $day ($ymd) 的查找 table。我希望它有效,我没有测试它。无论如何它应该给你一个想法。
$days = array();
$hours= array();
$ymds = array();
foreach ($table as $row) {
if(strlen($row['month'])<2) $row['month'] = "0{$row['month']}";
if(strlen($row['day'])<2) $row['day'] = "0{$row['day']}";
$ymd = "{$row['year']}-{$row['month']}-{$row['day']}";
$hour = $row['hour'];
$count = $row['count'];
if(!isset($ymds[$hour]) $ymds[$hour] = array() ;
if(!isset($ymds[$hour][$ymd]) $ymds[$hour][$ymd] = 0;
$ymds[$hour][$ymd] += $count;
$days[$ymd]= $ymd;
$hours[$hour]= $hour;
}
unset($row);
$handle = fopen($filename, 'w');
fputcsv($handle, $days);
foreach ($hours as $hour) {
$row = array();
foreach ($days as $ymd) {
$column = isset($ymds[$hour][$ymd]) ? $ymds[$hour][$ymd] : 0;
$row[] = $column;
}
fputcsv($handle, $row);
}
您的代码应该如下所示。
$filename = 'file.csv';
header( "Content-Type: text/csv;charset=utf-8" );
header( "Content-Disposition: attachment;filename=\"$filename\"" );
header("Pragma: no-cache");
header("Expires: 0");
$fp= fopen('php://output', 'w');
$header = array('customer_id', 'count', 'year', 'month', 'day', 'hour');
fputcsv($fp, $header);
foreach ($table as $row) {
fputcsv($fp, $row);
}