PHPのfile関数の使い方!ファイルの読み込んで処理する!

PHP

PHPでfile関数を使って、ファイルを読み込む方法について書いています。
載せているサンプルコードについては、PHPのバージョン8.1.8を使って検証しています。

file関数の使い方

file関数を使うことで、指定したファイルパスのファイルを簡単に読み込むことが可能です。
file関数でファイルを読み込むと、ファイルの行を配列に入れて返してくれます。

公式のドキュメントについては、こちらに記載があるので確認してみてください。
例えば、下記のように使うことができます。

<?php
$file = file("fruits.txt");
foreach ($file as $number => $content) {
    $numberText = $number + 1;
    echo "{$numberText}: {$content}";
}

最初にfile関数を使っています。
file関数に渡しているのはファイルのパスになります。
今回はローカルの「fruits.txt」を読み込んでいます。

読み込んだ内容が配列になって返ってきます。
$file変数で、読み込んだ内容を受け取っています。

foreach文でループして、内容を出力しています。
$number変数は配列のキーが0番から格納されるので、1を足して行番号として使っています。
$contentはファイルの内容になります。

動作確認する

今回は下記のファイル(fruits.txt)を用意しました。

フルーツリスト!
りんご
ぶどう
オレンジ

先ほどのプログラムを実行すると、このように表示されました。
1行ずつ読み込まれていることが確認できました。

1: フルーツリスト!
2: りんご
3: ぶどう
4: オレンジ

file関数の引数・返り値

file関数に渡す引数や返り値についてまとめました。

第1引数

第1引数にはファイルへのパスを指定します。
相対パス・絶対パスどちらでも指定することが可能です。

第2引数のflagsでFILE_USE_INCLUDE_PATHを指定すると、phpに設定しているinclude_path配下のファイルを相対パスで指定できます。

第2引数

ファイルを読み込むときの設定を定数で指定します。
下記の定数をひとつ指定するか、複数指定することが可能です。

定数値 内容
FILE_USE_INCLUDE_PATH include_path配下のファイルを対象にする
FILE_IGNORE_NEW_LINES ファイルの行についている最後の改行を省略する
FILE_SKIP_EMPTY_LINES 空行を読み飛ばす

第3引数

ストリームコンテキストを指定することができます。
ストリームコンテキストについては公式ドキュメントのこちらにあります。

返り値について

ファイルの内容が配列に入って返ってきます。
各行の改行コードはついたままです。
ファイルの読み込みに失敗すると、論理値のfalseが返ってきます。

file関数の第2引数(flags)を試す

file関数の第2引数の挙動を試してみました。

FILE_USE_INCLUDE_PATHを使ってみる

FILE_USE_INCLUDE_PATHを指定すると、include_path配下のファイルを読み込めるとのことで、試してみました。
include_pathについては、phpinfo関数で確認したり、phpコマンドで確認することができます。

今回はinclude_pathとして、/usr/local/Cellar/php/8.1.8/share/php/pearが設定されていました。
「PEAR.php」ファイルがインクルードパスの配下にあったので、読み込んでみました。pearライブラリへのパスかと思います。

$file = file("PEAR.php", FILE_USE_INCLUDE_PATH);
foreach ($file as $content) {
    echo "{$content}";
}

このように指定すると、インクルードパスの配下を相対パスで探してくれるようです。

$file変数で、ファイルの内容が入った配列を受け取りました。
その後にforeach文を使って、配列の内容を出力しています。

確認すると、下記のように「PEAR.php」ファイルの内容が出力されました。

<?php
/**
 * PEAR, the PHP Extension and Application Repository
 *
 * PEAR class and PEAR_Error class
 *
 * PHP versions 4 and 5
--------省略------------------
 */

FILE_IGNORE_NEW_LINESを使ってみる

配列の改行が省略されるということで、実際に使ってみました。

$file = file("fruits.txt", FILE_IGNORE_NEW_LINES);
foreach ($file as $number => $content) {
    $numberText = $number + 1;
    echo "{$numberText}: {$content}";
}

最初のプログラムにFILE_IGNORE_NEW_LINESを指定してみました。

これで配列が返ってきますが、行の最後にある改行が削除されます。
読み込むfruits.txtファイルでは、このように改行されています。

フルーツリスト!
りんご
ぶどう
オレンジ

実行すると、下記のように改行が消えて1行になりました。

1: フルーツリスト!2: りんご3: ぶどう4: オレンジ

FILE_SKIP_EMPTY_LINESを使ってみる

空行を読み飛ばしてくれるということで、実際に使ってみました。

FILE_SKIP_EMPTY_LINESはFILE_IGNORE_NEW_LINESと一緒に使います。
FILE_SKIP_EMPTY_LINESだけの場合だと、改行してあるだけの行はスキップ対象になりません。
最後の改行コードをFILE_IGNORE_NEW_LINESで削除して、FILE_SKIP_EMPTY_LINESで空白やスペースなど、本当に何もない行をスキップします。

$file = file("fruits.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($file as $number => $content) {
    $numberText = $number + 1;
    echo "{$numberText}: {$content}";
}

|」を使って、第2引数を複数指定しました。
改行を削除して、空行をスキップします。
ファイルの内容を下記のようにして、改行コードのみの行を含めてみます。

フルーツリスト!
りんご

ぶどう


オレンジ

実行すると、下記のように空行は出力されずに表示されました。

1: フルーツリスト!2: りんご3: ぶどう4: オレンジ

改行コードのみの行はスキップされることが確認できました。
半角スペースなどが入っている行はスキップされないので注意しましょう。

そういう行を読み飛ばしたい場合にはtrim関数を使って判定すると良いです。

$file = file("fruits.txt");
$count = 1;
foreach ($file as $content) {
    if (trim($content) != '') {
        echo "{$count}: {$content}";
        $count++;
    }
}

おわりに

今回はPHPのfile関数を使って、ファイルを読む方法について書きました。
file関数を使うことで、第1引数に渡したパスのファイルを簡単に読み込むことができました。

CSVファイルを読み込みたい場合には、SplFileObjectの利用を検討してみてください。

コメント

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