2012-02-15 81 views
4

我試圖將php/mysql生成的表格轉換爲可下載的csv文件。當用戶輸入搜索參數時,將調用一個mysql表並將結果作爲表返回。將列標題添加到使用PHP的CSV文件

我以前在這個線程所提供的解決方案,它的工作原理驚人:Create a CSV File for a user in PHP

我能夠讓用戶保存或查看結果爲CSV文件。我遇到的問題是我不確定如何將列標題添加到文件。例如,返回的結果採用以下格式:$ result [x] ['office'],$ result [x] ['user']等等,但我也想添加列標題,如「辦公室」和「用戶」,以便任何查看csv文件的人都能立即知道數據的含義。

這是生成CSV文件中的函數:

header("Content-type: text/csv"); 
    header("Content-Disposition: attachment; filename=$file.csv"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    outputCSV($data); 

function outputCSV($data) { 
     $outstream = fopen("php://output", "a"); 
     function __outputCSV(&$vals, $key, $filehandler) { 
      fputcsv($filehandler, $vals); // add parameters if you want 
     } 
     array_walk($data, "__outputCSV", $outstream); 
     fclose($outstream); 
    } 

我試圖創建下面的函數,然後調用它的權利之前,我打電話outputCSV,但沒有成功:

function create_file_header() 
{  
    $headers = 'Office, User, Tag, Value'; 
    $fp = fopen("php://output", "w"); 
    file_put_contents("$file.csv", $headers); 
    fclose($fp); 
} 

任何幫助,非常感謝。調用outputCSV前

+0

用'w'模式打開文件http://php.net/manual/en/function.fopen.php – CBusBus 2012-02-15 17:36:35

回答

9

要創建標題,你應該在前面加上一個標題行數組,並使用fputcsv正常。

你不談論的$data的格式,但如果它是一個關聯數組,你可以爲一個通用的解決方案做到這一點:

function toCSV($data, $outstream) { 
    if (count($data)) { 
     // get header from keys 
     fputcsv($outstream, array_keys($data[0])); 
     // 
     foreach ($data as $row) { 
      fputcsv($outstream, $row); 
     } 
    } 
} 

我沒有看到array_walk()在受益foreach循環。

2

這樣做:

array_unshift($data, array('Office', 'User', 'Tag', 'Value')); 

或者,如果$data元素是關聯數組,這將是更加動態:

array_unshift($data, array_keys($data[0])); 
+1

這是一個天才的解決方案!我最後在稍微不同的情況下使用了'array_push()',但這對於通過使用'fetch_fields()'然後向它們添加更多字段的人在MySQL中獲得標題列是完美的。榮譽。 – RCNeil 2013-09-10 04:24:17

0

你不能只是把它放在outputCSV功能?

header("Content-type: text/csv"); 
header("Content-Disposition: attachment; filename=$file.csv"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
outputCSV($data); 

function outputCSV($data) { 
    $outstream = fopen("php://output", "a"); 

    $headers = 'Office, User, Tag, Value'; 
    fwrite($outstream,$headers); 

    function __outputCSV(&$vals, $key, $filehandler) { 
     fputcsv($filehandler, $vals); // add parameters if you want 
    } 
    array_walk($data, "__outputCSV", $outstream); 
    fclose($outstream); 
} 
+0

只是一個說明。根據我的經驗,我需要在'$ headers ='Office,User,Tag,Value'行的末尾加上'。「\ r \ n」',即'$ headers ='Office,User,Tag,Value '。「\ r \ n」'或者第一行會被添加到標題行而不會換行。 – IIIOXIII 2014-10-15 10:28:26

0

添加可選$headers參數,以此來outputCSV功能。如果你的代碼通過他們,他們將被前置到CSV陣列:

outputCSV($data, array('Office', 'User')); 

// 

function outputCSV($data, $headers = null) { 
    $outstream = fopen("php://output", "a"); 
    function __outputCSV(&$vals, $key, $filehandler) { 
     fputcsv($filehandler, $vals); // add parameters if you want 
    } 
    if ($headers) { 
     $data = array_merge(array($headers), $data); 
    } 
    array_walk($data, "__outputCSV", $outstream); 
    fclose($outstream); 
}