PHPで、ファイルを読み込んだり書き込んだりする関数やクラスの使い方について解説します。
file_***_contents関数 – シンプルにまるっと処理する
PHPでファイルの読み込みや書き込みをする最も簡単な方法が、file_get_contents()
およびfile_put_contents()
関数を使う方法です。
ファイルをまるごと読み込む
PHPのfile_get_contents()
関数を使うと、簡単にファイルの内容をすべて取得することができます。
$contents = file_get_contents('ファイルのパス');
第一引数でファイルのパスを指定します。ファイルのパスは、絶対パス、相対パス、URLで指定することができます。
戻り値
file_get_contents()
関数は、指定したファイルの内容を文字列として返します。ファイルの読み込みに失敗した場合はfalse
を返します。
エラーハンドリング
file_get_contents()
関数は、ファイルが存在しない場合や読み込み権限がない場合にfalse
を返します。エラーハンドリングをするために、is_readable()
関数を使用してファイルの存在や読み込み可否をチェックしましょう。
$file = './file.txt';
if (is_readable($file)) {
$contents = file_get_contents($file);
} else {
echo 'ファイルが存在しないか、読み込み権限がありません';
}
ファイルにまるごと書き込む
PHPのfile_put_contents()
関数を使うと、簡単にファイルにデータを書き込むことができます。
$file = 'ファイルのパス';
$data = '書き込む内容';
file_put_contents($file, $data);
第一引数にファイルのパス、第二引数に書き込む内容を指定します。書き込む内容は、文字列や配列などを指定することができます。配列を指定した場合は、配列の値がずらっと書き込まれます。改行やスペースを間に入れることなくずらっと書き込まれます。
書き込むファイルが存在しない場合は新規作成されます。ファイルがすでに存在する場合は内容が上書きされます。
戻り値
file_put_contents()
関数は、書き込みが成功した場合には書き込んだバイト数を返します。書き込みに失敗した場合はfalse
を返します。
追記モード
デフォルトでは、file_put_contents()
関数はファイルを上書きします。もしファイルの既存の内容を残して新しい内容を追加したい場合は、第三引数にFILE_APPEND
フラグを指定します。
$file = 'ファイルのパス';
$data = '追記する内容';
file_put_contents($file, $data, FILE_APPEND);
エラーハンドリング
file_put_contents()
関数は、ファイルの書き込みに失敗した場合にfalse
を返します。エラーハンドリングを行うためには、戻り値をチェックしましょう。
$file = 'ファイルのパス';
$data = '書き込む内容';
if (file_put_contents($file, $data) !== false) {
echo '書き込みに成功しました';
} else {
echo '書き込みに失敗しました';
}
fopen関数 – 1行ずつ処理する
PHPのfopen()
およびfclose()
関数を使うときは、次のような手順でファイルを処理します。
- ファイルを開く (
fopen()
) - ファイルの読み書きをする (
fgets()
/fread()
/fwrite()
など) - ファイルを閉じる (
fclose()
)
file_get_contents()
/file_put_contents()
関数と比べると手間がかかりますが、fopen()
関数は、データを1行ずつ処理したい場合によく使われます。また、扱うファイルのサイズが大きい場合に、1行ずつ処理したほうがメモリの節約になったりもします。うまく使い分けましょう。
ファイルのオープンとクローズ
fopen()
関数を使用してファイルを開き、処理が終了したらfclose()
関数を使用してファイルを閉じます。次のようなコードになります。
//ファイルを開く
$handle = fopen('ファイルのパス', 'モード');
//ファイルの処理
//ファイルを閉じる
fclose($handle);
fopen()
関数の第一引数は、開くファイルのパスを指定します。絶対パス、相対パス、URLで指定できます。第二引数は、モードを指定します。ざっくり言うと読み込みモードか書き込みモードかの指定です。以下のモードを指定できます。
値 | 読み書き | ファイルポインタ | ファイルが存在しない時 | ファイルが存在する時 |
---|---|---|---|---|
r | 読み込み | 先頭 | エラー | – |
r+ | 読み込み/書き込み | 先頭 | エラー | – |
w | 書き込み | 先頭 | 作成する | ファイルサイズをゼロにする |
w+ | 読み込み/書き込み | 先頭 | 作成する | ファイルサイズをゼロにする |
a | 書き込み | 終端 | 作成する | – |
a+ | 読み込み/書き込み | 終端 | 作成する | – |
x | 書き込み | 先頭 | 作成する | エラー |
x+ | 読み込み/書き込み | 先頭 | 作成する | エラー |
c | 書き込み | 先頭 | 作成する | – |
c+ | 読み込み/書き込み | 先頭 | 作成する | – |
はい。一覧表にしてみましたが、ご理解いただけたでしょうか。解りませんよね。私もです。というわけで、文学的な表現でどうぞ。
値 | 使いどころ |
---|---|
r /r+ | ファイルを読み込むとき |
w /w+ | 既存ファイルを上書きするとき |
a /a+ | 既存ファイルの終端に追記するとき |
x /x+ | ファイルが存在しない場合に限り作成して書き込むとき |
c /c+ | 既存ファイルの先頭に追記するとき |
fopen()
関数は、成功した場合にはファイルポインタリソースを返し、失敗した場合にはfalse
を返します。ファイルポインタリソースとは、どのファイルのどの場所にファイルポインタがあるかという情報のことです。
ファイルポインタリソースは変数に代入して利用します。変数名はなんでもいいのですが、$handle
や$fp
がよく使われます。もちろん、$fairupointa
でもOKです。私はそーゆーの嫌いだけど。
ファイルの処理が終わったら、fclose()
関数でファイルを閉じるのが様式美とされています。
ファイルを1行ずつ読み込む
テキストファイルを1行ずつ読み込むには、PHPのfgets()
関数を使います。
//ファイルを開く
$handle = fopen('./file.txt', 'r');
//ファイルポインタが有効ならば
if ($handle) {
//データを1行ずつ読み込んで
while (($line = fgets($handle)) !== false) {
//読み込んだデータを処理する
}
//ファイルを閉じる
fclose($handle);
} else {
echo 'ファイルを開けませんでした';
}
まず、fopen()
関数を使ってファイルを開きます。第一引数はファイルのパスを指定します。第二引数は読み込みモードとしてr
を指定します。
次に、while
ループを使用してfgets()
関数を呼び出し、ファイルから1行ずつ読み込みます。fgets()
関数は、ファイルポインタがある行を読み込み、ファイルポインタを次の行に進めます。読み込んだ行は$line
変数に代入されるので、これをゴニョゴニョと処理しましょう。
fgets()
関数は、ファイルの終端に達した場合にfalse
を返すので、そこでwhile
ループが終了します。
エラーハンドリング
上記の例では、fopen()
の結果がfalse
だった場合に「ファイルを開けませんでした」というメッセージを出力しています。
ファイルを読み込む
ファイルから指定したバイト数だけデータ読み込むには、PHPのfread()
関数を使います。
読み込むファイルのサイズが小さいならば、いっきに全部読み込むこともできるし、サイズが大きいならば、小分けにして読み込むことでメモリの節約になります。
//ファイルのパス
$file = './file.txt';
//ファイルを開く
$handle = fopen($file, 'r');
//ファイルポインタが有効ならば
if ($handle) {
//データを指定した長さだけ読み込む
$data = fread($handle, filesize($file));
//ファイルを閉じる
fclose($handle);
} else {
echo 'ファイルを開けませんでした';
}
まず、fopen()
関数を使ってファイルを開きます。第一引数はファイルのパスを指定します。第二引数は読み込みモードとしてr
を指定します。
次に、fread()
関数を使ってファイルを読み込みます。第一引数にはファイルポインタリソースを指定し、第二引数には読み込むバイト数を指定します。上記の例ではfilesize()
関数を使ってファイルサイズを取得し、ファイル全体を読み込んでいます。
ファイルに書き込む
ファイルにデータを書き込むには、PHPのfwrite()
/fputs()
関数を使います。fputs()
はfwrite()
のエイリアスなので、どちらでも全く同じ動作をします。
//ファイルを開く
$handle = fopen('ファイルのパス', 'w');
//ファイルポインタが有効ならば
if ($handle) {
//ファイルにデータを書き込む
fwrite($handle, '書き込むデータ');
//ファイルを閉じる
fclose($handle);
} else {
echo 'ファイルを開けませんでした';
}
まず、fopen()
関数でファイルを開きます。第一引数でファイルのパスを指定します。第二引数は書き込みモードとしてw
を指定しました。
次に、fwrite()
関数を使って、ファイルにデータを書き込みます。第一引数にはファイルポインタリソースを指定し、第二引数には書き込むデータを指定します。
書き込みのモード
上記の例では、書き込みのモードとしてw
を指定しましたが、他にa
、x
、c
などがあり、上書きか追記か、既存ファイルをどうするか等によってモードを使い分ける必要があります。各モードの違いはファイルのオープンとクローズのセクションで解説しています。
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
CSVを扱う
CSV(Comma Separated Values)は、データをカンマで区切って表現する形式です。PHPでは、CSV形式のデータを扱うための便利な関数fgetcsv()
とfputcsv()
が用意されています。これらを使用することで、簡単にCSVファイルの読み書きを行うことができます。
CSVファイルからデータを読み込む
PHPのfgetcsv()
関数を使うと、CSVファイルから1行ずつデータを読み込むことができます。読み込んだデータは配列として取得できます。
//ファイルを開く
$handle = fopen('ファイルのパス', 'r');
//ファイルポインタが有効ならば
if ($handle) {
//データを1行ずつ読み込んで
while (($data = fgetcsv($handle)) !== false) {
//読み込んだデータを処理する
}
//ファイルを閉じる
fclose($handle);
} else {
echo 'ファイルを開けませんでした';
}
まず、fopen()
関数を使ってファイルを開きます。第一引数はCSVファイルのパスを指定します。第二引数は読み込みモードとしてr
を指定します。
次に、while
ループを使用してfgetcsv()
関数を呼び出し、CSVファイルから1行ずつ読み込みます。fgetcsv()
関数は、ファイルポインタがある行を読み込み、ファイルポインタを次の行に進めます。読み込んだ行は配列として$data
変数に代入されるので、これをあれこれと処理しましょう。
fgetcsv()
関数は、ファイルの終端に達した場合にfalse
を返すので、そこでwhile
ループが終了します。
CSVファイルにデータを書き込む
PHPのfputcsv()
関数を使うと、CSVファイルにデータを書き込むことができます。配列を渡すとCSV形式に変換して書き込んでくれます。
//ファイルを開く
$handle = fopen('ファイルのパス', 'a');
//ファイルポインタが有効ならば
if ($handle) {
//ファイルにデータを書き込む
fputcsv($handle, array('データ1', 'データ2', 'データ3'));
//ファイルを閉じる
fclose($handle);
} else {
echo 'ファイルを開けませんでした';
}
まず、fopen()
関数を使ってCSVファイルを開きます。第一引数にはファイルのパスを指定し、第二引数には書き込みモードとしてw
/a
/x
/c
のいずれかを指定します。
次に、fputcsv()
関数を使って配列形式のデータをCSV形式に変換してファイルに書き込みます。各データはカンマで区切られ、行ごとに改行が挿入されます。
SplFileObjectクラス – オブジェクト指向で書きたい
PHPのSplFileObject
クラスを使ったファイルの読み書きの方法を解説します。fopen()
関数のオブジェクト指向版です。
ファイルを1行ずつ読み込む
SplFileObject
クラスを使ってテキストファイルを1行ずつ読み込む方法は2つあります。
foreachを使う方法
foreach
を使ってテキストファイルを1行ずつ読み込むには、次のようにします。
//読み込むファイルのパス
$filename = './file.txt';
//インスタンスを生成
$file = new SplFileObject($filename);
//行番号と内容を1行ずつ出力
foreach ($file as $line_num => $line) {
echo $line_num . ':' . $line;
}
まず、SplFileObject
クラスでインスタンスを生成します。第一引数はファイルのパスを指定します。第二引数は読み込みモードとしてr
を指定します。ただし、第二引数の初期値はr
なので省略可能です。
次に、オブジェクト$file
をforeach
で回して、1行ずつデータを取得します。キー$line_num
が0から始まる行番号、値$line
が内容となります。
fgets()メソッドを使う方法
fgets()
メソッドを使ってテキストファイルを1行ずつ読み込むには、次のようにします。
//読み込むファイルのパス
$filename = './file.txt';
//インスタンスを生成
$file = new SplFileObject($filename);
//行番号と内容を1行ずつ出力
while (!$file->eof()) {
echo $file->key() . ':' . $file->fgets();
}
まず、SplFileObject
クラスでインスタンスを生成します。これはforeach
を使う場合と同じです。
次に、オブジェクト$file
をwhile
で回して、1行ずつデータを取得します。key()
メソッドは現在の行番号を取得します。fgets()
メソッドはファイルから1行取り出します。eof()
メソッドはファイルの終端に達するとtrue
を返します。
ファイルを読み込む
ファイルから指定したバイト数だけデータ読み込むには、fread()
メソッドを使います。
//読み込むファイルのパス
$filename = './file.txt';
//インスタンスを生成
$file = new SplFileObject($filename);
//ファイルの内容を取得
$contents = $file->fread($file->getSize());
まず、SplFileObject
クラスでインスタンスを生成します。
次に、fread()
メソッドを使ってファイルを読み込みます。第一引数で読み込むバイト数を指定します。上記の例ではgetSize()
メソッドを使ってファイルサイズを取得し、ファイル全体を読み込んでいます。
ファイルに書き込む
ファイルにデータを書き込むには、fwrite()
メソッドを使います。
//読み込むファイルのパス
$filename = './file.txt';
//インスタンスを生成
$file = new SplFileObject($filename, 'w');
//ファイルにデータを書き込む
$file->fwrite('書き込むデータ');
まず、SplFileObject
クラスでインスタンスを生成します。第一引数でファイルのパスを指定します。第二引数は書き込みモードとしてw
を指定しました。
次に、fwrite()
メソッドを使って、ファイルにデータを書き込みます。第一引数に書き込むデータを指定します。
書き込みのモード
fopen()
関数と同じように、書き込みのモードはw
の他にa
、x
、c
などがあります。ファイルのオープンとクローズのセクションで解説しているので確認してください。
CSVを扱う
SplFileObject
クラスには、CSV形式のデータを扱うためのメソッドfgetcsv()
とfputcsv()
が用意されています。これらを使用することで、簡単にCSVファイルの読み書きを行うことができます。
CSVファイルからデータを読み込む
fgetcsv()
メソッドを使うと、CSVファイルから1行ずつデータを読み込むことができます。読み込んだデータは配列として取得されます。
//読み込むファイルのパス
$filename = './file.csv';
//インスタンスを生成
$file = new SplFileObject($filename);
//データを1行ずつ読み込む
while (!$file->eof()) {
$data[] = $file->fgetcsv();
}
まず、SplFileObject
クラスでインスタンスを生成します。
次に、オブジェクト$file
をwhile
で回して、1行ずつデータを取得します。fgetcsv()
メソッドはファイルからCSVデータを1行取り出して配列で返します。eof()
メソッドはファイルの終端に達するとtrue
を返します。
CSVファイルにデータを書き込む
fputcsv()
メソッドを使うと、CSVファイルにデータを書き込むことができます。配列を渡すとCSV形式に変換して書き込んでくれます。
//書き込むファイルのパス
$filename = './file.csv';
//書き込むデータの配列
$list = array(
array('データ1', 'データ2', 'データ3'),
array('データ4', 'データ5', 'データ6'),
array('データ7', 'データ8', 'データ9')
);
//インスタンスを生成
$file = new SplFileObject($filename, 'w');
//データを1行ずつ書き込む
foreach ($list as $fields) {
$file->fputcsv($fields);
}
まず、SplFileObject
クラスでインスタンスを生成します。第一引数にはファイルのパスを、第二引数には書き込みモードとしてw
/a
/x
/c
のいずれかを指定します。
次に、書き込むデータの配列$list
をforeach
で回して、データを1行ずつ書き込んでいきます。fputcsv()
メソッドは配列形式のデータをCSV形式に変換してファイルに書き込みます。
file関数 – 配列に格納する
PHPのfile()
関数を使うと、ファイル全体を読み込んで各行を要素とする配列を作ることができます。
$lines = file('ファイルのパス');
第一引数でファイルのパスを指定します。ファイルのパスは、絶対パス、相対パス、URLで指定することができます。
オプション
file()
関数の第二引数で以下のオプションを指定することができます。
オプション | 説明 |
---|---|
FILE_USE_INCLUDE_PATH | include_pathのファイルを探す |
FILE_IGNORE_NEW_LINES | 配列の各要素の最後の改行を省略する |
FILE_SKIP_EMPTY_LINES | 空行を読み飛ばす |
戻り値
file()
関数は、指定したファイルの内容を配列として返します。ファイルの読み込みに失敗した場合はfalse
を返します。
さいごに
PHPでファイルの読み込み書き込みをする方法について解説しました。複数の方法がありますが、用途に応じてうまく使い分けましょう。
でわでわ
プログラミングの独学に行き詰まっていませんか?誰かに相談したい、もっと効率よく学びたいなら、プログラミングスクールを検討してみてください。
コメント