Parallels Desktop 20%OFFセール中Check!

【PHP入門】ファイルの読み書きをする4つの方法

PHPでファイルの読み書きをする方法

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()関数を使うときは、次のような手順でファイルを処理します。

  1. ファイルを開く (fopen())
  2. ファイルの読み書きをする (fgets()/fread()/fwrite()など)
  3. ファイルを閉じる (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()関数でファイルを閉じるのが様式美とされています。

fclose()することによって、リソースが開放されます。もし、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を指定しましたが、他にaxcなどがあり、上書きか追記か、既存ファイルをどうするか等によってモードを使い分ける必要があります。各モードの違いはファイルのオープンとクローズのセクションで解説しています。

プログラミング学習、お疲れさまです

プログラミングの独学に行き詰まっていませんか?誰かに相談したい、もっと効率よく学びたいなら、プログラミングスクールを検討してみてください。

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なので省略可能です。

次に、オブジェクト$fileforeachで回して、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を使う場合と同じです。

次に、オブジェクト$filewhileで回して、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の他にaxcなどがあります。ファイルのオープンとクローズのセクションで解説しているので確認してください。

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クラスでインスタンスを生成します。

次に、オブジェクト$filewhileで回して、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のいずれかを指定します。

次に、書き込むデータの配列$listforeachで回して、データを1行ずつ書き込んでいきます。fputcsv()メソッドは配列形式のデータをCSV形式に変換してファイルに書き込みます。

file関数 – 配列に格納する

PHPのfile()関数を使うと、ファイル全体を読み込んで各行を要素とする配列を作ることができます。

$lines = file('ファイルのパス');

第一引数でファイルのパスを指定します。ファイルのパスは、絶対パス、相対パス、URLで指定することができます。

オプション

file()関数の第二引数で以下のオプションを指定することができます。

オプション説明
FILE_USE_INCLUDE_PATHinclude_pathのファイルを探す
FILE_IGNORE_NEW_LINES配列の各要素の最後の改行を省略する
FILE_SKIP_EMPTY_LINES空行を読み飛ばす

戻り値

file()関数は、指定したファイルの内容を配列として返します。ファイルの読み込みに失敗した場合はfalseを返します。

file()関数は、ファイルの内容を一度にメモリに読み込むため、非常に大きなファイルを処理するのには向いていません。大きなファイルを扱う場合は、他の方法を検討しましょう。

さいごに

PHPでファイルの読み込み書き込みをする方法について解説しました。複数の方法がありますが、用途に応じてうまく使い分けましょう。

でわでわ

プログラミング学習、お疲れさまです

プログラミングの独学に行き詰まっていませんか?誰かに相談したい、もっと効率よく学びたいなら、プログラミングスクールを検討してみてください。

PHPでファイルの読み書きをする方法

この記事が気に入ったら
いいね または フォローしてね!

シェアしてね

コメント

コメントする

目次