PHPでファイルの読み込みをする主な4つの方法

  • このエントリーをはてなブックマークに追加
  • Pocket

スポンサードリンク

PHPでファイル読み込みする方法はいくつもありますが、その中でもよく使われている方法を4パターン紹介します。

簡単に出力できたり、配列に格納してくれたり、読み込みが簡単だったりとさまざまです。

いつもなんとなく関数を使っていた人も、この記事で違いを比較すれば、上手く使い分けることができるようになるでしょう。

 

fgets関数で1行ずつ読み込み

ファイルから1行読み込みます。

fgets()は、通常fopen()fclose()と併用して読み込み処理をします。

読み込むファイル

今回読み込むのは以下、改行を含めた文章が書いてあるテキストファイルです。

memo.txt

PHPでファイル処理
ファイルの読み込み
fgets関数の使い方

fgetsの基本的な使い方

PHPでファイル処理

fgets()は改行までの1行単位で取得する関数なので、上記のサンプルではファイルの1行目のみが取得されました。

1行だけでなく、ファイルすべてを取得したい場合は、1行取得する処理をループさせ、繰り返し取得していきます。

fgetsで全文取得

fgets()でファイルの中身全文を取得するにはループ処理を使います。

PHPでファイル処理
ファイルの読み込み
fgets関数の使い方

ファイルの中身全てが表示されました。

参考:PHPのwhile文でループ処理

fgetsでの読み込みの流れ

fgets()で読み込む際は、通常は上記サンプルのようにfopen()fclose()をセットで使います。

fgets()でファイル全文を読み込む際の流れは以下のとおりです。

 

  1. fopen()で読み込むファイルを読み込みモードで開く
  2. feof()でファイルポインタが最終行まで行ってなかったらwhile文でループ処理
  3. fgets()でファイルを読み込む
  4. ファイルの行末まで読み込んだらループから抜け、fclose()でファイルを閉じる

ここで使うファイル読み込み関数は次で詳細を説明します。

ファイル読み込み関数の構文

fgets関数

ファイルを1行読み込む。

fgets (fopenで開いたファイルポインタ [ , 1行の長さ(文字数)(省略可)]);

ファイルポインタは、読み込むファイルをfopen()で開いたものが入ります。

最初はよく分かりませんが、上記のようにやるもんなんだと特に考えずにコピーして動かしてみましょう。

1行の長さは省略可能ですが、ここで長さを指定すると、1行の文字数は長さから-1した数で改行されます。

ファイル内の1行が8kbを超えている場合が多ければ、この長さを指定するとパフォーマンスが良くなるようです。

(よく4096を指定する例が多いようですが、バイト数から来ているようです。)

feos関数

ファイルポインタが終端に達しているかを調べる。

feos ( 読み込むファイルポインタ );

fopen()で開いたファイルのポインタが、行末まで達しているかを調べます。

カーソルが、ファイルの一番最後まで行ったかどうかを調べる感じですね。

1行目を読み込み、2行目を読み込み…とループ処理しながら、ファイルの一番終端に達したら、ループから抜けるという処理をしていますが、そういったループ処理でよく使われます。

fopen関数, fclose関数

fgets()を使う際はセットでこの関数も使います。

詳しくはこちらでご確認ください。

参考:fopen関数とfclose関数の構文

fgetss関数でタグを取り除き読み込み

fgets()ではなくfgetss()をご紹介します。

fgets()とほぼ同じですがfgetss()sが余分に1つ多く付きますw

fgetss()はファイルにHTMLタグやPHPタグがあった場合、それらを削除して読み込んでくれます。

読み込むファイル

今回読み込むのは以下、HTMLタグを含めたHTMLファイルです。

memo.html

<h1>PHPでファイル処理</h1>
<h2>ファイルの読み込み</h2>
<p>fgetss関数</p>

fgetssの使い方

ソースの表示

<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行だけでなく全文取得してくれます。

PHPでファイル処理
ファイルの読み込み
file_get_contents関数の使い方

ファイル全文を丸ごと表示されましたね。

変数に格納もできるので、あちこちで使い回すこともできます。

ただ改行タグ<br>が入っていないと、改行文字\nだけではブラウザ上では改行されませんので注意しましょう。

参考:PHPでの改行方法(ブラウザとソース表示)

file_get_contentsの構文

file_get_contents ( 読み込みたいファイル名またはパス [ , include_path [ , context [ , 開始位置 [ , 読み込む文字バイト数 ]]]] ([ ]は省略可));

基本的には先ほどのサンプルのように、読み込むファイル名を指定するだけでよいでしょう。

includecontextは省略し、ファイルのある部分だけを取得する場合は以下のように書きます。

readfile関数で即読み込み

ファイルを出力します。

読み込むファイル

今回読み込むのは以下、改行を含めた文章が書いてあるテキストファイルです。

memo.txt

PHPでファイル処理
ファイルの読み込み
readfile関数の使い方

readfileの使い方

PHPでファイル処理
ファイルの読み込み
readfile関数の使い方

上記のように、echoprintなどの文字を出力する言語構造がなくても、この関数単体で出力できます。

ファイル処理のechoと言えますねw

readfileの構文

readfile ( 読み込みたいファイル名またはパス [ , include_path [ , context ]] ([ ]は省略可));

読み込みに成功すると文字数(バイト数)を返すので、変数に格納して他で使いまわしたりはできません。

バイト数しか出力されないからです。

出力したくなったら、その場でreadfile()しましょう。

他のファイル操作系関数と同様includecontextもありますが、あまり使わないでしょう。

file関数で配列に格納

ファイル全体を読み込んで配列に格納します。

1行が1つの要素となります。

読み込むファイル

今回読み込むのは以下、改行を含めた文章が書いてあるテキストファイルです。

memo.txt

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

file関数の使い方

Array ( [0] => PHPでファイル処理 [1] => ファイルの読み込み [2] => file関数の使い方 )

1行ごとに配列に格納されましたね。

1行が1要素なので、さまざまな配列処理により自由自在なデータ処理ができます。

file関数の構文

file ( 読み込みたいファイル名またはパス [ , フラグ(省略可)] );

第二引数のフラグは以下の3種類で、省略も可能です。

  1. FILE_USE_INCLUDE_PATH
    ファイルを、インクルードディレクトリも含めて探す
  2. FILE_IGNORE_NEW_LINES
    配列の各要素の最後に改行文字\nを追加しない
  3. FILE_SKIP_EMPTY_LINES
    空の行は読み飛ばす

改行文字を追加させたくない場合は第二引数に2を指定します。

配列をループ処理でHTMLタグに1要素ずつ挿入させる際、改行はいらないということもあるでしょう。

空白の行が混ざったファイルというのもあり得るので3を指定すると、空行は飛ばしてくれます。

フラグの空行についての注意

3.FILE_SKIP_EMPTY_LINESは、改行文字が行の最後にあると空文字ではないため飛ばしてくれません。

そんなときは23を両方指定します。

改行文字を追加せずに、空行を飛ばすよう指定すればよいでしょう。

file関数でHTMLタグにループで埋め込む

配列処理でHTMLタグにファイルを1行ずつ埋め込んでみましょう。

・PHPでファイル処理
・ファイルの読み込み
・file関数の使い方

上記のようにHTMLの<li>タグに埋め込んで表示されました。

配列処理ができるので、HTMLと相性がいい関数ですね。

参考:PHPのforeachで配列処理

スポンサードリンク

  • このエントリーをはてなブックマークに追加
  • Pocket

コメント

  1. ss より:

    fgetsで全文取得の項目で
    対象ファイルが見つからない場合、無限ループになります

コメントを残す

*