少しグーグルを使えば、これを見つけることができたでしょう:http://www.the-art-of-web.com/php/dataexport/
データの準備
$data = array(
array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
);
最初のステップは、データをタブ区切り形式で出力することです (CSV も使用できますが、少し複雑になります)。これを実現するために、次のコードを使用します。
<?php
header("Content-Type: text/plain");
$flag = false;
foreach( $data as $row ) {
if( !$flag ) {
// display field/column names as first row
echo implode( "\t", array_keys( $row ) ) . "\r\n";
$flag = true;
}
echo implode( "\t", array_values( $row ) ) . "\r\n";
}
exit;
?>
ブラウザーで出力をより簡単に表示できるように、コンテンツ タイプを text/plain に設定します。それ以外の場合、HTML フォーマットがないため、出力は 1 行のテキストとして表示されます。
出力の最初の行は列見出しになります (この場合、フィールド名が使用されます)。値はタブ \t で区切られ、行は改行 \n で区切られます。出力は次のようになります。
firstname lastname age
Mary Johnson 25
Amanda Miller 18
James Brown 31
Patricia Williams 7
Michael Davis 43
Sarah Miller 24
Patrick Miller 27
このコードには、すぐには明らかにならない弱点が既に存在します。出力するフィールドの 1 つにすでに 1 つまたは複数のタブ文字、またはさらに悪いことに改行が含まれている場合はどうなるでしょうか。段区切りと改行を示すためにこれらの文字に依存しているため、プロセス全体が破棄されます。
解決策は、タブ文字を「エスケープ」することです。この場合、タブをリテラル \t に置き換え、改行をリテラル \n に置き換えて、書式設定に影響を与えないようにします。
<?php
function cleanData( &$str ) {
$str = preg_replace( "/\t/", "\\t", $str );
$str = preg_replace("/\r?\n/", "\\n", $str);
}
header("Content-Type: text/plain");
$flag = false;
foreach( $data as $row ) {
if( !$flag ) {
// display field/column names as first row
echo implode( "\t", array_keys( $row ) ) . "\r\n";
$flag = true;
}
array_walk( $row, 'cleanData' );
echo implode( "\t", array_values( $row ) ) . "\r\n";
}
exit;
?>
ここで、各行がエコーされる前に、タブ文字が "\t" に置き換えられるため、列が分割されません。また、データ内の改行は「\n」に置き換えられます。