PHPでファイル読み込みする方法はいくつもありますが、その中でもよく使われている方法を4パターン紹介します。
簡単に出力できたり、配列に格納してくれたり、読み込みが簡単だったりとさまざまです。
いつもなんとなく関数を使っていた人も、この記事で違いを比較すれば、上手く使い分けることができるようになるでしょう。
目次
fgets関数で1行ずつ読み込み
ファイルから1行読み込みます。
fgets()
は、通常fopen()
fclose()
と併用して読み込み処理をします。
読み込むファイル
今回読み込むのは以下、改行を含めた文章が書いてあるテキストファイルです。
memo.txt
PHPでファイル処理
ファイルの読み込み
fgets関数の使い方
fgetsの基本的な使い方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// ファイルを変数に格納 $filename = 'memo.txt'; // fopenでファイルを開く('r'は読み込みモードで開く) $fp = fopen($filename, 'r'); // fgetsでファイルを読み込み、変数に格納 $txt = fgets($fp); // ファイルを読み込んだ変数を出力 echo $txt.'<br>'; // fcloseでファイルを閉じる fclose($fp); |
PHPでファイル処理
fgets()
は改行までの1行単位で取得する関数なので、上記のサンプルではファイルの1行目のみが取得されました。
1行だけでなく、ファイルすべてを取得したい場合は、1行取得する処理をループさせ、繰り返し取得していきます。
fgetsで全文取得
fgets()
でファイルの中身全文を取得するにはループ処理を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// ファイルを変数に格納 $filename = 'memo.txt'; // fopenでファイルを開く('r'は読み込みモードで開く) $fp = fopen($filename, 'r'); // whileで行末までループ処理 while (!feof($fp)) { // fgetsでファイルを読み込み、変数に格納 $txt = fgets($fp); // ファイルを読み込んだ変数を出力 echo $txt.'<br>'; } // fcloseでファイルを閉じる fclose($fp); |
PHPでファイル処理
ファイルの読み込み
fgets関数の使い方
ファイルの中身全てが表示されました。
fgetsでの読み込みの流れ
fgets()
で読み込む際は、通常は上記サンプルのようにfopen()
とfclose()
をセットで使います。
fgets()
でファイル全文を読み込む際の流れは以下のとおりです。
fopen()
で読み込むファイルを読み込みモードで開くfeof()
でファイルポインタが最終行まで行ってなかったらwhile文でループ処理fgets()
でファイルを読み込む- ファイルの行末まで読み込んだらループから抜け、
fclose()
でファイルを閉じる
ここで使うファイル読み込み関数は次で詳細を説明します。
ファイル読み込み関数の構文
fgets関数
ファイルを1行読み込む。
fgets (fopenで開いたファイルポインタ [ , 1行の長さ(文字数)(省略可)]);
ファイルポインタは、読み込むファイルをfopen()
で開いたものが入ります。
最初はよく分かりませんが、上記のようにやるもんなんだと特に考えずにコピーして動かしてみましょう。
1行の長さは省略可能ですが、ここで長さを指定すると、1行の文字数は長さから-1
した数で改行されます。
ファイル内の1行が8kbを超えている場合が多ければ、この長さを指定するとパフォーマンスが良くなるようです。
(よく4096
を指定する例が多いようですが、バイト数から来ているようです。)
feos関数
ファイルポインタが終端に達しているかを調べる。
feos ( 読み込むファイルポインタ );
fopen()
で開いたファイルのポインタが、行末まで達しているかを調べます。
カーソルが、ファイルの一番最後まで行ったかどうかを調べる感じですね。
1行目を読み込み、2行目を読み込み…とループ処理しながら、ファイルの一番終端に達したら、ループから抜けるという処理をしていますが、そういったループ処理でよく使われます。
fopen関数, fclose関数
fgets()
を使う際はセットでこの関数も使います。
詳しくはこちらでご確認ください。
fgetss関数でタグを取り除き読み込み
fgets()
ではなくfgetss()
をご紹介します。
fgets()
とほぼ同じですがfgetss()
はs
が余分に1つ多く付きますw
fgetss()
はファイルにHTMLタグやPHPタグがあった場合、それらを削除して読み込んでくれます。
読み込むファイル
今回読み込むのは以下、HTMLタグを含めたHTMLファイルです。
memo.html
<h1>PHPでファイル処理</h1>
<h2>ファイルの読み込み</h2>
<p>fgetss関数</p>
fgetssの使い方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// ファイルを変数に格納 $filename = 'memo.html'; // fopenでファイルを開く('r'は読み込みモードで開く) $fp = fopen($filename, 'r'); // whileで行末までループ処理 while (!feof($fp)) { // fgetssの第二引数(バイト数)と第三引数(除外しないタグを指定)は省略可能 $txt = fgetss($fp, 4096, '<h1>'); // ファイルを読み込んだ変数を出力 echo $txt.'<br>'; } // fcloseでファイルを閉じる fclose($fp); |
ソースの表示
<h1>PHPでファイル処理</h1>
ファイルの読み込み
fgetss関数
ブラウザのソースを見てみると、上記のようにHTMLタグが外れて表示されました。
第二引数以降は省略可能です。
h1
タグだけが残っていますが、これは第三引数に<h1>
を指定したからです。
第三引数には除外しないタグを指定できるので、所定のHTMLタグを指定すると、そのタグは除去されません。
HTMLファイルからテキストだけを読み込む際に便利ですね。
file_get_contents関数で簡単読み込み
読み込むファイル
今回読み込むのは以下、改行を含めた文章が書いてあるテキストファイルです。
memo.txt
PHPでファイル処理
ファイルの読み込み
file_get_contents関数の使い方
1行だけでなく全文読み込むシンプルな関数
file_get_contents()
を使えばfopen()
fgets()
fclose()
による一連のファイルオープンから読み込み、クローズまでを1つの関数で簡単に処理できます。
しかも、1行だけでなく全文取得してくれます。
1 2 3 4 5 6 7 |
// ファイルを変数に格納 $filename = 'memo.txt'; // ファイルを読み込み変数に格納 $content = file_get_contents($filename); // ファイルの中身を出力 echo $content; |
PHPでファイル処理
ファイルの読み込み
file_get_contents関数の使い方
ファイル全文を丸ごと表示されましたね。
変数に格納もできるので、あちこちで使い回すこともできます。
ただ改行タグ<br>
が入っていないと、改行文字\n
だけではブラウザ上では改行されませんので注意しましょう。
file_get_contentsの構文
file_get_contents ( 読み込みたいファイル名またはパス [ , include_path [ , context [ , 開始位置 [ , 読み込む文字バイト数 ]]]] ([ ]は省略可));
基本的には先ほどのサンプルのように、読み込むファイル名を指定するだけでよいでしょう。
include
やcontext
は省略し、ファイルのある部分だけを取得する場合は以下のように書きます。
1 2 3 |
// includeやcontextを省略し、開始位置と文字バイト数だけ指定 // 21文字目から14文字分だけ読み込む file_get_contents($filename, NULL, NULL, 20, 14); |
readfile関数で即読み込み
ファイルを出力します。
読み込むファイル
今回読み込むのは以下、改行を含めた文章が書いてあるテキストファイルです。
memo.txt
PHPでファイル処理
ファイルの読み込み
readfile関数の使い方
readfileの使い方
1 2 3 4 5 |
// ファイルを変数に格納 $filename = 'memo.txt'; // readfileでファイルの全文出力 readfile($filename); |
PHPでファイル処理
ファイルの読み込み
readfile関数の使い方
上記のように、echo
やprint
などの文字を出力する言語構造がなくても、この関数単体で出力できます。
ファイル処理のecho
と言えますねw
readfileの構文
readfile ( 読み込みたいファイル名またはパス [ , include_path [ , context ]] ([ ]は省略可));
読み込みに成功すると文字数(バイト数)を返すので、変数に格納して他で使いまわしたりはできません。
バイト数しか出力されないからです。
出力したくなったら、その場でreadfile()
しましょう。
他のファイル操作系関数と同様include
やcontext
もありますが、あまり使わないでしょう。
file関数で配列に格納
ファイル全体を読み込んで配列に格納します。
1行が1つの要素となります。
読み込むファイル
今回読み込むのは以下、改行を含めた文章が書いてあるテキストファイルです。
memo.txt
PHPでファイル処理
ファイルの読み込み
file関数の使い方
file関数の使い方
1 2 3 4 5 6 7 8 |
// ファイルを変数に格納 $filename = 'memo.txt'; // ファイルを配列に格納し、さらに変数に格納 $lines = file($filename); // 配列を出力 print_r($lines); |
Array ( [0] => PHPでファイル処理 [1] => ファイルの読み込み [2] => file関数の使い方 )
1行ごとに配列に格納されましたね。
1行が1要素なので、さまざまな配列処理により自由自在なデータ処理ができます。
file関数の構文
file ( 読み込みたいファイル名またはパス [ , フラグ(省略可)] );
第二引数のフラグは以下の3種類で、省略も可能です。
FILE_USE_INCLUDE_PATH
ファイルを、インクルードディレクトリも含めて探すFILE_IGNORE_NEW_LINES
配列の各要素の最後に改行文字\n
を追加しないFILE_SKIP_EMPTY_LINES
空の行は読み飛ばす
改行文字を追加させたくない場合は第二引数に2
を指定します。
配列をループ処理でHTMLタグに1要素ずつ挿入させる際、改行はいらないということもあるでしょう。
空白の行が混ざったファイルというのもあり得るので3
を指定すると、空行は飛ばしてくれます。
フラグの空行についての注意
3.FILE_SKIP_EMPTY_LINES
は、改行文字が行の最後にあると空文字ではないため飛ばしてくれません。
そんなときは2
と3
を両方指定します。
改行文字を追加せずに、空行を飛ばすよう指定すればよいでしょう。
1 2 |
// 第二引数は |(OR)で2つ指定できる file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); |
file関数でHTMLタグにループで埋め込む
配列処理でHTMLタグにファイルを1行ずつ埋め込んでみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php // ファイルを変数に格納 $filename = 'memo.txt'; // ファイルを配列に格納し、さらに変数に格納 $lines = file($filename); ?> <ul> <!-- foreachでファイルの配列をループ処理 --> <?php foreach ($lines as $line) : ?> <!-- 配列の要素を1行ずつ<li>タグに埋め込む --> <li><?php echo $line; ?></li> <?php endforeach; ?> </ul> |
・PHPでファイル処理
・ファイルの読み込み
・file関数の使い方
上記のようにHTMLの<li>
タグに埋め込んで表示されました。
配列処理ができるので、HTMLと相性がいい関数ですね。
fgetsで全文取得の項目で
対象ファイルが見つからない場合、無限ループになります