ちょっとつまづいた所もあったのでメモ。
まずCSVには下記のデータを記述することとする。
今回は連想配列ではなく、値は全て文字列に整形された配列を扱った。
$array = [
[
'1',
'hoge',
'aaaa'
],
[
'2',
'hoge2',
'bbbb
bbbb'
],
[
'3',
'hoge3',
'cc'
]
];
// ヘッダーの定義
$header = ['id','name','content'];
PHPでCSVを生成する方法としてまずはfputcsvで出力を行った。
fputcsvを使う
CSVを生成するには、CSVファイルを開いて内容をループで記述していけば良い。
$fp = fopen(dirname(__FILE__) . '/test.csv', 'w');
// CSVファイルの生成
fputcsv($fp, $header, ',');
foreach ($array as $item) {
fputcsv($fp, $item, ',');
}
fclose($fp);
これで終わりかと思ったが、これだと id = 2 の値に関しては改行を含む値があるため出力行が異なってしまう。
$ cat test.csv
id,name,content
1,hoge,aaaa
2,hoge2,"bbbb
bbbb"
3,hoge3,cc
要件としては改行した値も同一行に含めたかったので、下記のように改行を置換する方法で対応した。
foreachでCSVを生成する
$fp = fopen(dirname(__FILE__) . '/test.csv', 'w');
// CSVファイルの生成
fputcsv($fp, $header, ',');
$data_str = '';
foreach ($array as $item) {
for ($i = 0; $i < count($item); $i++) {
$item[$i] = str_replace(['\r\n', PHP_EOL, '\r'], '', $item[$i]);
if ($i != count($item) - 1) {
$data_str .= $item[$i] . ',';
} else {
// 最後の項目はカンマを付与しない
$data_str .= $item[$i];
}
}
$data_str .= "\n";
}
file_put_contents(dirname(__FILE__) . '/test.csv', $data_str);
fclose($fp);
そうすると下記のように値が同一行に出力される。
$ cat test.csv
1,hoge,aaaa
2,hoge2,bbbb bbbb
3,hoge3,cc
FTP送信
FTP送信は ftp_put を使用する。
function ftpUpload()
{
// 接続を確立する
$conn_id = ftp_connect($ftp_server);
// ユーザー名とパスワードでログインする
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
if ($login_result) {
// パッシブモードで送信
ftp_pasv($conn_id, true);
// ファイルをアップロードする
if (ftp_put($conn_id, $remote_filepath, $local_filepath, FTP_ASCII)) {
$result = true;
} else {
$result = false;
}
// 接続を閉じる
ftp_close($conn_id);
} else {
ftp_close($conn_id);
}
return $result;
}