今回はPHPでファイルの入出力について解説します。
ファイルの入出力はPHPに限らずプログラミング言語の基本中の基本です。PHPではファイルを1行実処理処理する関数の他に、全文を読み書きする関数も用意されています。用途に応じて使い分けできるのでしっかり学んでいきましょう。
目次
今回使用するファイルの内容
今回解説に使うファイルの内容は以下の通りとします。1行ずつ県名が書かれていますが、広島県の次に空白行をあえて入れておきました。これをfile.txtというファイル名で保存されているものとして解説を進めます。
1 2 3 4 5 6 7 8 9 |
北海道 宮城県 東京都 愛知県 大阪府 広島県 徳島県 鹿児島県 |
fopen関数によるファイル処理
fopen関数はファイルを1行ずつ処理するための関数です。fgets関数やfwrite関数と組み合わせることでファイルの読み込み、書き込みを可能にします。
1行ずつ読み込む方法
以下がファイルを1行ずつ読み込むプログラム例です。fopen関数の第一引数にファイル名を入れ、第二引数に「r」を渡すことで読み込みを意味します。fgets関数は1行ずつ順番に読み込むのでwhile文でファイルの最後まで追っていくのが通例です。
1 2 3 4 5 6 |
echo "fopen 関数--------\n"; $fp = fopen('file.txt', "r"); while (($line = fgets($fp))) { echo $line; } fclose($fp); |
出力結果は以下の通りファイルの内容をそのまま出力できています。実際は上から1行ずつ順番に表示させています。
1 2 3 4 5 6 7 8 9 |
北海道 宮城県 東京都 愛知県 大阪府 広島県 徳島県 鹿児島県 |
1行ずつ書き込む方法
次にファイルを書き込む方法について説明します。第二引数に「w」を渡すことで書き込みを意味します。これは既存のファイルの中身を維持することなく上書きするので注意が必要です。書き込みにはfwright関数を使います。
1 2 3 4 5 |
$fp = fopen("file.txt","w"); fwrite($fp, "北海道\n"); fwrite($fp, "東京都\n"); fwrite($fp, "福岡県\n"); fclose($fp); |
実行した結果、file.txtの中身は以下のようになります。既存の中身は完全に消え新たに加えた3行だけが保存された状態になります。
1 2 3 |
北海道 東京都 福岡県 |
ファイルの末尾に追加する方法
fopen関数の第二引数に「a」を指定することで、上書きではなく元の内容を維持した上で末尾に値を追加することができます。以下がプログラム例です。
1 2 3 |
$fp = fopen("file.txt","a"); fwrite($fp, "沖縄県\n"); fclose($fp); |
結果は以下のとおりです。最後に「沖縄県」が追加されました。
1 2 3 4 5 6 7 8 9 10 |
北海道 宮城県 東京都 愛知県 大阪府 広島市 徳島県 鹿児島県 沖縄県 |
以上がfopen関数の解説でしたが、この方法でファイルの入出力に関することはすべて網羅できていると思います。しかし、PHPでは以下に示すように別の方法も用意されています。面白い機能が備わっているので、状況に使い分けていくとより効率的なプログラム開発が実現できるでしょう。fopen関数と比較しながら以下ご覧ください。
file関数でファイルを配列に格納する
file関数はファイルの読み込み機能しかありませんが、ファイルの内容を文字列ではなく配列に格納してくれる点で非常に便利な関数です。
使い方も非常に簡単で、以下のようにたった1行でファイルの中身を配列で返してくれます。
1 |
$fp = file('file.txt'); |
それでは実際に使用例を見てみましょう。以下はファイルの中身を配列$fpに配列として格納しています。それをforeachループを使って出力させている例です。
1 2 3 4 |
$fp = file('file.txt'); foreach($fp as $value){ echo $value . "\n"; } |
結果はご覧のとおりです。なぜか1行ごとに空白行が現れました。これは文字列の最後に改行コードが存在しているからで、file関数では改行コードごと配列変数に格納するためにこのような出力結果となってしまうわけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
北海道 宮城県 東京都 愛知県 大阪府 広島市 徳島県 鹿児島県 |
改行コードを除外したい場合は、file関数の第二引数に「FILE_IGNORE_NEW_LINES」というオプションを入れます。これにより配列の各要素の最後の改行を省略することができます。
1 2 3 4 |
$fp = file('file.txt', FILE_IGNORE_NEW_LINES); foreach($fp as $value){ echo $value . "\n"; } |
結果は以下のとおりです。改行が除外できました。
1 2 3 4 5 6 7 8 9 |
北海道 宮城県 東京都 愛知県 大阪府 広島市 徳島県 鹿児島県 |
第二引数のオプションについてもう1つ面白い機能があるので紹介します。それは、「FILE_SKIP_EMPTY_LINES」というオプションで、これを加えることで空白行を除外することができます。
以下は、改行コードを除外し且つ空白行を除外する例です。オプシンを複数指定したい場合は「|」で区切ります。
1 2 3 4 |
$fp = file('file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach($fp as $value){ echo $value . "\n"; } |
結果は以下の通り改行コードおよび空白行を除外することができました。
1 2 3 4 5 6 7 8 |
北海道 宮城県 東京都 愛知県 大阪府 広島市 徳島県 鹿児島県 |
ファイルの読み込みの際に配列に格納するような場面では、fopen関数ではなくfile関数を使った方がソースコードがコンパクトになりますね。
file_get_contents/file_put_contentsによるファイル処理
最後にfile_get_contents関数およびfile_put_contents関数を用いたファイル処理について解説します。これらの特徴はファイルの中身をまるごと読み込める(書き込める)点です。fopen関数ではファイルを1行ごと読み書きしますし、file関数は配列化という特徴を持ちました。file_get_contents(file_put_contents)ではファイルの中身をまるごと一括で読み込みたいケースで使います。例えばテキストエディタのファイルの読み書きのようなケースが該当します。
file_get_contentsによるファイルの読み込み
file_get_contents関数を使ったファイルの読み込み例です。ファイルの中身すべてを文字列として変数$fpに格納し出力させています。
1 2 |
$fp = file_get_contents('file.txt'); echo $fp; |
以下が出力例です。ファイルの中身がそのまま出力されました。
1 2 3 4 5 6 7 8 9 |
北海道 宮城県 東京都 愛知県 大阪府 広島市 徳島県 鹿児島県 |
file_put_contentsによるファイルへの書き込み
次にfile_put_contents関数を使ったファイルへの書き込みについてです。第二引数に書き込みたい内容を渡すことで書き込みできます。
1 |
file_put_contents('file.txt', "沖縄県"); |
file_put_contents関数はファイルの中身を維持することなく上書きしてしまいます。もし維持したい場合は、file_get_contents関数で一旦読み込んでおいて、その末尾に追加したい文字列を入れた上で書き込むという形を取るのが一般的です。
1 2 3 4 |
$fp = file_get_contents('file.txt'); $fp .= "沖縄県\n"; file_put_contents('file.txt', $fp); echo $fp; |
結果はご覧のとおりです。
1 2 3 4 5 6 7 8 9 10 |
北海道 宮城県 東京都 愛知県 大阪府 広島市 徳島県 鹿児島県 沖縄県 |
まとめ
いかがでしょうか。今回はPHPでファイルの入出力について解説しました。
PHPではファイルの入出力に関して複数の関数が用意されていることがおわかりいただけたかと思います。用途に応じて使い分けることで効率的なプログラム開発が可能になります。ぜひしっかり学んで役立ててください。