PHPでファイルを読み込む方法をまとめました。
6つの方法でファイルを読み込んでみます。
・readfile関数
・file_get_contents関数
・SplFileObjectクラス
・fread関数
・fgets関数
fread関数とfgets関数については、fopen関数でファイルを開いてから使います。
載せているサンプルコードについては、PHPのバージョン8.1.8を使って検証しています。
file関数で読み込む
file関数を使って、ファイルの内容を読み込んでみます。
file関数で読み込むと、読み込んだファイルを配列として返してくれます。
file関数については、公式ドキュメントのこちらにも記載があります。
下記のように使うことができます。
<?php
$contents = file("hello.txt");
foreach ($contents as $number => $content) {
$fileNumber = $number + 1;
echo "{$fileNumber}: " . $content;
}
file関数を使って、ファイルを読み込みました。
file関数に渡しているのは、ファイルのパスになります。
ファイルのパスを渡すと、ファイルを読み込んで配列にして返してくれます。(改行はそのままついてきます)
返ってきたファイルの内容の配列をforeach文で回して表示しています。
$number変数は配列のキーになります。0からの値が入っているので、行番号として使います。
$content変数には、読み込んだファイルの内容が1行ずつ入ってきます。
$number変数は0からなので、1を足して、1からの行番号にしています。
今回は、ローカルにあるファイルを読み込みましたが、URLを指定してWeb上のファイルを使うこともできます。
動作確認
下記のようにファイルを用意して、動作を確認してみます。
PHPのファイル読み込みのテスト
テキストファイルを読み込む
Hello, World!
そうすると、このように行番号付きで出力されました。
1行ずつ読み込まれていることが確認できました。
1: PHPのファイル読み込みのテスト
2: テキストファイルを読み込む
3: Hello, World!
readfile関数で読み込む
readfile関数を使って、ファイルの内容を読み込んでみます。
readfile関数については、公式ドキュメントのこちらにも記載があります。
readfile関数はファイルを読み込んで、標準出力にすぐに書き出す関数です。
<?php
readfile("hello.txt");
実行すると、ファイルの内容をそのまま、標準出力に書き出します。
コンソールで実行すると、ファイルの内容がそのままコンソールに出力される形です。
readfile関数の使い所としては、Web上でファイルをダウンロードさせるときに使います。
下記のように書くと、PHPファイルにアクセスしたときに、任意のファイルをダウンロードさせることができます。
今回は画像ファイルの”test.png”ファイルをダウンロードするようにしてみました。
<?php
$image = 'test.png';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Cache-Control: no-cache, must-revalidate");
header("Expires: 0");
header('Content-Disposition: attachment; filename="'.basename($image).'"');
header('Content-Length: ' . filesize($image));
header('Pragma: public');
readfile($image);
file_get_contents関数で読み込む
file_get_contents関数を使って、ファイルの内容を読み込んでみます。
file_get_contents関数はファイルを読み込んで、文字列として返してくれます。
file_get_contents関数については、公式ドキュメントのこちらにも記載があります。
例えば、下記のように使うことができます。
<?php
$contents = file_get_contents("hello.txt");
var_dump($contents);
渡したファイルパスの内容を文字列として、$contents変数に返しています。
$contents変数の内容をvar_dump関数で出力しました。
今回はローカルのファイルパスを指定しましたが、URLを指定することもできます。
動作確認
下記のようにファイルを用意して、動作を確認してみます。
PHPのファイル読み込みのテスト
テキストファイルを読み込む
Hello, World!
そうすると、このように文字列が返ってきていることが確認できました。
string(96) "PHPのファイル読み込みのテスト
テキストファイルを読み込む
Hello, World!"
SplFileObjectクラスで読み込む
SplFileObjectクラスを使って、ファイルの内容を読み込んでみます。
SplFileObjectクラスにファイルパスを指定すると、ファイルオブジェクトを返してくれます。
SplFileObjectクラスについては、公式ドキュメントのこちらにも記載があります。
<?php
$file = new SplFileObject("hello.txt");
foreach ($file as $number => $content) {
$fileNumber = $number + 1;
echo "{$fileNumber}: " . $content;
}
SplFileObjectをnewするときに、コンストラクタにファイルパスを渡します。
こうすると、ファイルオブジェクトが返ってきます。
$file変数で返ってきたファイルオブジェクトを受け取っています。
foreach文に渡すことで、配列と同じように使うことが可能です。
$number変数には、0からの番号が格納されるので、行番号として使っていきます。
$content変数には、読み込んだファイルの内容が1行ずつ入ってきます。
SplFileObjectクラスはsetFlagsメソッドを使うと、空行の読み飛ばすことも可能です。
CSVファイルを読むときの設定もあり、CSVファイルを読み込むときには、こちらのクラスを使うと良いかと思います。
動作確認
下記のようにファイルを用意して、動作を確認してみます。
PHPのファイル読み込みのテスト
テキストファイルを読み込む
Hello, World!
そうすると、file関数と同様の結果になります。
1行ずつ読み込まれていることが確認できました。
1: PHPのファイル読み込みのテスト
2: テキストファイルを読み込む
3: Hello, World!
fread関数で読み込む
fread関数でファイルを読み込みます。
fopen関数でファイルにアクセスした後に使うことが可能です。文字列としてファイルの内容を取得します。
fread関数については、公式ドキュメントのこちらにも記載があります。
例えば、下記のように使います。
<?php
$filePath = "hello.txt";
$handle = fopen($filePath, "r");
$contents = fread($handle, filesize($filePath));
var_dump($contents);
fclose($handle);
最初に$filePath変数に読み込みたいファイルパスを指定しています。
fopen関数を使用して、ファイルを開いています。
第1引数にファイルパスを渡しています、第2引数にモードを設定しています。
モードには”r”を設定しているので、読み込みになります。
ファイルのリソース型が返ってくるので、$handle変数に格納しています。
その次の処理で、fread関数を使ってファイルの内容を読み込んでいます。
第1引数に、先ほど取得したリソース型の$handle変数を指定しています。
第2引数は、読み込むファイルのサイズを指定しています。filesize関数にファイルパスを渡すことで、取得しています。
読み込んだファイルの内容を$contents変数で受け取っています。
var_dump関数で変数の内容を出力しています。
最後にfcloseでファイルを閉じて処理を終了します。
渡しているのは、開いたファイルのリソースです。
動作確認
下記のようにファイルを用意して、動作を確認してみます。
PHPのファイル読み込みのテスト
テキストファイルを読み込む
Hello, World!
そうすると、file_get_contents関数と同様の結果になります。
文字列として、ファイルの内容が取得できていることが確認できました。
string(96) "PHPのファイル読み込みのテスト
テキストファイルを読み込む
Hello, World!"
fgets関数で読み込む
fgets関数でファイルを読み込みます。
こちらもfopen関数でファイルにアクセスした後に使います。
fgets関数を使うことで、file関数と同様に、1行ずつ読み込んで処理することが可能です。
fgets関数については、公式ドキュメントのこちらにも記載があります。
例えば、下記のように使います。
$filePath = "hello.txt";
$handle = fopen($filePath, "r");
$number = 1;
while ($line = fgets($handle)) {
echo "{$number}行目: " . $line;
$number += 1;
}
fclose($handle);
最初に$filePath変数に読み込みたいファイルパスを指定しています。
fopen関数を使用して、ファイルを開いています。
第1引数にファイルパスを渡しています、第2引数にモードを設定しています。
$handleにはファイルのリソースが返ってきます。
次の行で、行番号に使う$number変数を用意しています。
そして、while文を使用して、ファイルの内容を1行ずつ読み込んでいます。
fgets関数に渡しているのは、取得したリソース型の$handle変数です。
ファイルの内容を読み終わるまで、$line変数にファイルの内容を1行ずつ格納しています。
ループ処理では、行番号とファイルの内容を出力するようにしました。
最後にfcloseでファイルを閉じて処理を終了しています。
動作確認
下記のようにファイルを用意して、動作を確認してみます。
PHPのファイル読み込みのテスト
テキストファイルを読み込む
Hello, World!
そうすると、file関数と同様の結果になります。
1行ずつ処理されて、行番号と一緒にファイルの内容が出力されました。
1行目: PHPのファイル読み込みのテスト
2行目: テキストファイルを読み込む
3行目: Hello, World!
ファイルを読み込む6つの方法まとめ
今回紹介したファイルを読み込む方法を表にまとめました。
関数・クラス | 内容 |
---|---|
file | ファイルを行単位で読む |
readfile | ファイルを読み込んで、すぐに標準出力に書く |
file_get_contents | ファイル全体を文字列で読み込む |
SplFileObject | クラスをnewして使う。行単位で読み込む |
fread | fopen関数で取得したリソースを使う ファイルを文字列で読み込む |
fgets | fopen関数で取得したリソースを使う ファイルを行単位で読み込む |
簡単に読み込みたいときには、file_get_contents関数・file関数を使うとよさそうです。
文字列で一括で読み込むときにはfile_get_contents関数、行単位で読み込むときにfile関数を使いました。
ダウンロード処理にはreadfile関数を使っていきましょう。
コメント