PHPでファイルの読み書きする3つの方法(fopen/file/file_get_contents・file_put_contents)

今回はPHPでファイルの入出力について解説します。

ファイルの入出力はPHPに限らずプログラミング言語の基本中の基本です。PHPではファイルを1行実処理処理する関数の他に、全文を読み書きする関数も用意されています。用途に応じて使い分けできるのでしっかり学んでいきましょう。

今回使用するファイルの内容

今回解説に使うファイルの内容は以下の通りとします。1行ずつ県名が書かれていますが、広島県の次に空白行をあえて入れておきました。これをfile.txtというファイル名で保存されているものとして解説を進めます。

 

fopen関数によるファイル処理

fopen関数はファイルを1行ずつ処理するための関数です。fgets関数やfwrite関数と組み合わせることでファイルの読み込み、書き込みを可能にします。

1行ずつ読み込む方法

以下がファイルを1行ずつ読み込むプログラム例です。fopen関数の第一引数にファイル名を入れ、第二引数に「r」を渡すことで読み込みを意味します。fgets関数は1行ずつ順番に読み込むのでwhile文でファイルの最後まで追っていくのが通例です。

 

出力結果は以下の通りファイルの内容をそのまま出力できています。実際は上から1行ずつ順番に表示させています。

 

【PHP入門】for文とwhile文の使い分け方
【PHP入門】for文とwhile文の使い分け方
phpで繰り返し処理を行いたい場合、「for文」や「while文」を使うことができます。 しかし、慣れないうち ...

 

1行ずつ書き込む方法

次にファイルを書き込む方法について説明します。第二引数に「w」を渡すことで書き込みを意味します。これは既存のファイルの中身を維持することなく上書きするので注意が必要です。書き込みにはfwright関数を使います。

 

実行した結果、file.txtの中身は以下のようになります。既存の中身は完全に消え新たに加えた3行だけが保存された状態になります。

 

ファイルの末尾に追加する方法

fopen関数の第二引数に「a」を指定することで、上書きではなく元の内容を維持した上で末尾に値を追加することができます。以下がプログラム例です。

 

結果は以下のとおりです。最後に「沖縄県」が追加されました。

 

以上がfopen関数の解説でしたが、この方法でファイルの入出力に関することはすべて網羅できていると思います。しかし、PHPでは以下に示すように別の方法も用意されています。面白い機能が備わっているので、状況に使い分けていくとより効率的なプログラム開発が実現できるでしょう。fopen関数と比較しながら以下ご覧ください。

 

file関数でファイルを配列に格納する

file関数はファイルの読み込み機能しかありませんが、ファイルの内容を文字列ではなく配列に格納してくれる点で非常に便利な関数です。

使い方も非常に簡単で、以下のようにたった1行でファイルの中身を配列で返してくれます。

 

それでは実際に使用例を見てみましょう。以下はファイルの中身を配列$fpに配列として格納しています。それをforeachループを使って出力させている例です。

 

結果はご覧のとおりです。なぜか1行ごとに空白行が現れました。これは文字列の最後に改行コードが存在しているからで、file関数では改行コードごと配列変数に格納するためにこのような出力結果となってしまうわけです。

 

改行コードを除外したい場合は、file関数の第二引数に「FILE_IGNORE_NEW_LINES」というオプションを入れます。これにより配列の各要素の最後の改行を省略することができます。

 

結果は以下のとおりです。改行が除外できました。

 

第二引数のオプションについてもう1つ面白い機能があるので紹介します。それは、「FILE_SKIP_EMPTY_LINES」というオプションで、これを加えることで空白行を除外することができます。

以下は、改行コードを除外し且つ空白行を除外する例です。オプシンを複数指定したい場合は「|」で区切ります。

 

結果は以下の通り改行コードおよび空白行を除外することができました。

 

ファイルの読み込みの際に配列に格納するような場面では、fopen関数ではなくfile関数を使った方がソースコードがコンパクトになりますね。

PHPで配列(Array)のforeach処理を極めて効率的なプログラミングを目指そう
PHPで配列(Array)のforeach処理を極めて効率的なプログラミングを目指そう
PHPで配列を繰り返し処理する方法を初学者向けに解説します。 繰り返し処理はPHPに限らず最も重要な制御ロジッ ...

 

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に格納し出力させています。

 

以下が出力例です。ファイルの中身がそのまま出力されました。

 

file_put_contentsによるファイルへの書き込み

次にfile_put_contents関数を使ったファイルへの書き込みについてです。第二引数に書き込みたい内容を渡すことで書き込みできます。

 

file_put_contents関数はファイルの中身を維持することなく上書きしてしまいます。もし維持したい場合は、file_get_contents関数で一旦読み込んでおいて、その末尾に追加したい文字列を入れた上で書き込むという形を取るのが一般的です。

 

結果はご覧のとおりです。

 

まとめ

いかがでしょうか。今回はPHPでファイルの入出力について解説しました。

PHPではファイルの入出力に関して複数の関数が用意されていることがおわかりいただけたかと思います。用途に応じて使い分けることで効率的なプログラム開発が可能になります。ぜひしっかり学んで役立ててください。

ざっくりPHP入門(初心者〜中級者向け)
ざっくりPHP入門(初心者〜中級者向け)
目次1 基本的な仕組みに関して1.1 phpのコンパイルと実行1.2 echoの仕組み1.3 issetとem ...

 

BLOGコンテンツをパーソナライズします

あなたは現在「プログラミング学習者」ですか?