PHPでファイルを読み込む6つの方法!

PHP

PHPでファイルを読み込む方法をまとめました。
6つの方法でファイルを読み込んでみます。

・file関数
・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関数を使っていきましょう。

コメント

タイトルとURLをコピーしました