2017-07-27 53 views
0

我想從我的數據庫獲取來自CSV的數據。我的問題是數據沒有排序。在我的CSV中只有一行數據。通過fputcsv以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']]); 
} 
+0

你想在單元格內做什麼? Customer_ID,數量還是兩者? – Adder

+0

@Adder我想在單元格內計數。 – Trayer

+1

你有什麼試過?從上面的代碼,它並沒有表明你已經嘗試過任何東西。我建議使用數組構建你想要的結構,然後foreach循環將它們放入CSV中。 Stack不在這裏爲你做你的工作。 – IsThisJavascript

回答

1

我已經適應了你的代碼。我添加了一個預處理步驟,創建一個索引爲$ hour和$ day($ ymd)的查找表。我希望它有效,我沒有測試它。無論如何,它應該給你一個想法。

$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); 
} 
0

您的代碼應該如下所示。

$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); 
}