【PHP】file関数を使ったファイルの読み込みとその他ファイル操作

こんにちは!エンジニアのノムラです。

PHPでWEBサービスやWEBアプリを作っていくと、ファイルの読み込みを行う場面があるかと思います。

この記事では、

  • file関数でのファイルの読み込み
  • file_get_contents関数を使ったファイルの読み込み
  • file_put_contents関数を使ったファイルの書き込み

といったファイルの入出力の方法から、

  • ファイルの有無を調べる関数
  • ファイルの更新日時を取得する方法

など、関数を使ったファイルの操作について解説していきたいと思います。

目次

ファイルの入出力

PHPには読み込んだファイルを、配列や文字列にして返す関数があります。
file関数file_get_contents関数です。

ファイルに書き込む関数にはfile_put_contents関数があります。

ここでは、それらの特徴や使い方などについて解説していきたいと思います。

file関数の特徴

fileの特徴として、読み込んだテキストファイルを行ごとに配列にして返すという点があげられます。
もしファイルの読み込みが失敗した場合は、FALSEが返ってきます。

file(ファイル名[,フラグ])

ファイル名には、読み込みたいファイル名を指定します。

フラグには、以下の定数を指定することができます。

フラグ名(定数)機能
FILE_IGNORE_NEW_LINES
配列の各要素の最後に改行文字が含まれない
FILE_SKIP_EMPTY_LINES
空行を配列の要素として読み込まない
FILE_USE_INCLUDE_PATH
include_pathのファイルを探す

フラグは、複数指定することも、省略することも可能です。

file関数を使った読み込み

では、実際にfile関数を使ってファイルを読み込んでみましょう。

読み込むファイル:test.txt

東京都
神奈川県
千葉県

埼玉県
<?php
$file_name = "test.txt";
var_dump(file($file_name));
?>

【出力結果】

array(5) {
  [0]=>
  string(11) "東京都
"
  [1]=>
  string(14) "神奈川県
"
  [2]=>
  string(11) "千葉県
"
  [3]=>
  string(2) "
"
  [4]=>
  string(9) "埼玉県"
}

var_dumpを使って返ってきた配列の中身を見てみましょう。

上のサンプルコードでは引数に、「FILE_IGNORE_NEW_LINES」[や「FILE_SKIP_EMPTY_LINES」を指定していません。

そのため、要素の最後に改行が含まれ、空行も配列の要素になっていることがわかります。

次はフラグに、「FILE_IGNORE_NEW_LINES」と「FILE_SKIP_EMPTY_LINES」を指定してみましょう。

<?php
$file_name = "test.txt";
var_dump(file($file_name,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
?>

【出力結果】

array(4) {
  [0]=>
  string(9) "東京都"
  [1]=>
  string(12) "神奈川県"
  [2]=>
  string(9) "千葉県"
  [3]=>
  string(9) "埼玉県"
}

フラグを複数指定する場合は、「|」(バーティカルライン)で区切りましょう。

上のサンプルコードでは、要素に改行文字が含まれていないことと、空行の要素がないことがわかるかと思います。

file_get_contentsを使った読み込み

ファイルの読み込みを行う関数は、fileだけでなく、file_get_contentsでも読み込むことができます。

fileとの違いとしては、読み込んだファイルを配列ではなく文字列として返す点と、読み込む文字のバイト数を指定できる点になります。

file_get_contents(ファイル名[,include_pathの使用,contextの使用[,開始位置[,最大バイト数]]])

ファイル名に、読み込みたいファイル名を指定します。

include_pathの使用には、trueを指定するとinclude_pathからファイルを検索できますが、使わない場合falseを指定してください。

contextの使用には、独自のコンテキストを使用する場合に指定してください。
使用しない場合は、NULLを指定します。

<?php
$file_name = "test.txt";
var_dump(file_get_contents($file_name));
?>

【出力結果】

string(47) "東京都
神奈川県
千葉県

埼玉県"

fileのときは各行のデータが配列の要素になっていましたが、file_get_contentsは、文字列としてファイルが読み込まれていることがわかります。

次に、開始位置最大バイト数を指定してファイルを読み込んでみましょう。

<?php
$file_name = "test.txt";
echo "<pre>";
var_dump(file_get_contents($file_name,false,NULL,0,9));
echo "</pre>";
?>

【出力結果】

string(9) "東京都"

開始位置に0を指定し、最大バイト数を9にすると、「東京都」の文字列のみが取得されました。

file_put_contentsを使った書き込み

file_put_contentsは、指定した文字列をファイルに書き込むことができる関数です。

file_put_contents(ファイル名,書き込むデータ[,フラグ,contextの使用])

ファイル名には、書き込みたいファイルを指定します。
ファイル名が存在しなかった場合、新規にファイルを作成して書き込みます。

書き込むデータには、ファイルに書き込みたいデータを指定します。
文字列や配列が指定可能です。

フラグには、以下を指定することができます。

フラグ名(定数)機能
FILE_USE_INCLUDE_PATH
include_pathを使用する。
FILE_APPEND
ファイルを追記モードで開く。
LOCK_EX
書き込み中にファイルをロックする。

contextには、独自のコンテキストを使用する場合指定します。

<?php
$file_name = "test.txt";
file_put_contents($file_name,"大阪府");
var_dump(file_get_contents($file_name));
?>

【出力結果】

string(9) "大阪府"

test.txtには、file_put_contentsで「大阪府」を書き込みました。
書き込んだ後のtest.txtは、file_get_contentsで読み込み確認しています。

関数を使ったファイル操作

ファイルの入出力を行う関数を解説しましたが、PHPには他にもファイルの操作を行うことができる関数があります。

file_existsで存在するファイルか調べる

file_existsでは、ファイルまたはディレクトリが存在するか調べることができます。

file_exists(ファイルまたはディレクトリ名)

指定したファイル、またはディレクトリが存在する場合は「true」存在しない場合は「false」が返ってきます。

<?php
$file_name = "test.txt";

if(file_exists($file_name)){
    echo "ファイルが存在します";
}
?>

【出力結果】

ファイルが存在します

上のサンプルコードでは、if文を使ってtrueだった場合に「ファイルが存在します」と出力しています。

ディレクトリが存在しているかを調べる場合は以下のように記述します。

<?php
$dir = "test/css";

if(file_exists($dir)){
    echo "ディレクトリは存在します";
}else{
    echo "ディレクトリは存在しません";
}
?>

【出力結果】

ディレクトリは存在しません

このディレクトリは存在しないため、falseが返ってきています。
そのため、「ディレクトリは存在しません」と出力されました。

filesizeでファイルサイズを取得

filesizeでは、指定したファイルのサイズを取得することができます。

filesize(ファイル名)

ファイル名には、ファイルサイズを取得したいファイル名を指定してください。

<?php
$file_name = "test.txt";
echo filesize($file_name);
?>

【出力結果】

9

test.txtのサイズは9バイトであるため、9が返ってきました。

filemtimeで更新日時を取得

ファイルの更新日時を取得するには、filemtimeを使用します。

filemtime(ファイル名)

ファイル名には、更新日時を取得したいファイル名を指定してください。
返り値は、Unixタイムスタンプとして返ってきます。

<?php
$file_name = "test.txt";
echo date("Y/m/d H:i", filemtime($file_name));
?>

【出力結果】

2018/04/12 12:02

返ってきたタイムスタンプはdate関数でY/m/d H:iの形式にしました。

まとめ

file関数やfile_get_contents関数でファイルを読み込む方法や、その他関数を使ったファイルの操作について解説してきました。

ファイルの操作は、WEBサービスやWEBアプリをつくるときに非常によく使います。

しっかり理解して、マスターしていきましょう!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次