2012-02-15 17 views
4

私はphp/mysql生成テーブルをダウンロード可能なcsvファイルに変換しようとしています。ユーザが検索パラメータを入力すると、mysqlテーブルが呼び出され、結果がテーブルとして返されます。PHPを使用してCSVファイルに列ヘッダーを追加

私はこのスレッドで提供されるソリューションを使用し、それが途方も動作します:Create a CSV File for a user in PHP

私は、ユーザーがCSVファイルとして結果を保存するか表示できるようにすることができています。私が抱えている問題は、ファイルに列ヘッダーを追加する方法がわかりません。たとえば、結果は$ result [x] ['office']、$ result [x] ['user']などの形式で返されますが、 "Office"と "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); 
} 

ご協力いただきまして誠にありがとうございます。

+0

'w'モードでファイルを開くhttp://php.net/manual/en/function.fopen.php – CBusBus

答えて

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

I超えるarray_walk()の利益が表示されませんよforeachループ。

2

はoutputCSV呼び出す前に、この操作を行います:

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

あるいは、$dataの要素は連想配列であれば、これはよりダイナミックになります:

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

これは天才的な解決策です!私は 'array_push()'を使ってやや異なる場合がありましたが、これは 'fetch_fields()'を使ってMySQLのヘッダー列を取得してから、さらに多くのフィールドを追加するのに最適です。名声。 – RCNeil

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

0

は、あなたのoutputCSV関数にオプションの$headersパラメータを追加します。あなたのコードがそれらを通過した場合、彼らは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); 
} 
関連する問題