読者です 読者をやめる 読者になる 読者になる

PHPのfile関数でcsvを読み込んだ時に改行コードが含まれていた

下記のようなcsvファイルを読み込んでweb上に表示させる画面を作りました

20170410,タイトル1
20170411,タイトル2
20170412,タイトル3
20170413,タイトル4
20170414,タイトル5

まずfile関数で1行ずつ配列に格納しました

<?php

$array = file("/history.csv");

// $array[0]は"20170410,タイトル1"
// $array[1]は"20170411,タイトル2"

?>

後はこの配列をループさせて画面に表示するだけ

<?php

$array = file("/history.csv");

$content .= "<ul>";

for($i = 0;$i < count($array);$i++){
    $str = split(",", $array[$i]);
    $dt = date('Y&#47;m&#47;d',  strtotime($str[0]));
    $content .= "<li>".$dt."&nbsp;".$str[1]."</li>";	
}

$content .= "</ul>";

echo $content;

?>

画面で表示した結果

2017/04/10 タイトル1
2017/04/11 タイトル2
2017/04/12 タイトル3
2017/04/13 タイトル4
2017/04/14 タイトル5

ここまではよかったのですが、この配列にデータを追加してその内容でcsvファイルを更新ようとした時問題が発生しました。

<?php

$array = file("/history.csv");

array_push($array, "20170415,タイトル6");

$file = fopen("/history.csv", "w");

for($i = 0;$i < count($array);$i++){
    @fwrite($file, $array[$i]."\r\n");
}

fclose($file);

?>

出力したcsvファイル

2017/04/10 タイトル1

2017/04/11 タイトル2

2017/04/12 タイトル3

2017/04/13 タイトル4

2017/04/14 タイトル5

2017/04/15 タイトル6

何故か改行が増えてる・・・
改行コードは1個だけしか付加してないのに

原因はfile関数でcsvファイルを読み込む時に改行コードまで読み込んでいたから
読み込んだ時に下記のようになっていたということです

<?php

$array = file("/history.csv");

// $array[0]は"20170410,タイトル1\r\r"
// $array[1]は"20170411,タイトル2\r\r"

?>

file関数オプションにFILE_IGNORE_NEW_LINESを追加することで改行コードは付加されずに読み込まれます

<?php

$array = file("/history.csv", FILE_IGNORE_NEW_LINES);

// $array[0]は"20170410,タイトル1"
// $array[1]は"20170411,タイトル2"

?>

修正後に出力したcsvファイル

2017/04/10 タイトル1
2017/04/11 タイトル2
2017/04/12 タイトル3
2017/04/13 タイトル4
2017/04/14 タイトル5
2017/04/15 タイトル6