PHP入門 | テキストファイルの利用 | fileを使ってファイルのテキストを1行ずつ処理する

では、読み込んだテキストを処理するにはどうすればよいだろうか。PHPには「ファイルの内容を丸ごと読み込み、1行ずつ配列にまとめて返す」関数が用意されているので、それを利用すればよい。これはfileという関数である。

$変数 = file(ファイル指定);

このようにすると、引数で指定されたファイルを読み込み、1行ずつ分けてまとめた配列を返す。あとは$変数から配列の要素を順番に取り出して処理していけばよい。

しかし、一般的にこのような簡単な書き方をすることはあまりない。なぜなら、これだけでは「ファイルの読み込みに失敗した場合」を処理できないからである。もしファイル読み込みに失敗すると、その時点でエラーが発生し、スクリプトの実行が中断されてしまう。そうなると、その後の処理や表示も行われず、ページが途中で途切れてしまう。

そこで、fileのように実行に失敗する可能性がある場合は、次のように書くのが一般的である。

$変数 = @file(ファイル指定) or 失敗時の処理;

関数名の前に@記号を付けると、実行に失敗してもスクリプトを中断せずに続行する。また、関数の後にorを付けると、実行に失敗したときにor以降の処理を行える。

それでは、簡単な例を見てみよう。

<?php
    $result = "";
    $lines = @file("data.txt") or $result = "ファイルを読み込めません。";
    if ($lines != null){
        for($i = 0;$i < count($lines);$i++){
            $result .= ($i + 1) . ": " . $lines[$i] . "<br>";
        }
    }
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <p><?php echo $result; ?></p>
    </body>
</html>

これはdata.txtを読み込み、1行ずつ行番号を付けて表示する。もちろん各行も正しく改行されて表示される。ここでは次のようにファイルを読み込んでいる。

$lines = @file("data.txt") or $result = "ファイルを読み込めません。";

そして、読み込んだ$lines配列が空になるまで繰り返している。空かどうかは次のようにチェックしている。

if ($lines != null) {......

nullとは「空」を表す予約語である。変数に値が設定されていない、つまり空の状態を示す言葉である。

無事に取得できた場合は、for($i = 0; $i <count($lines); $i++)のようにして、$linesから1行ずつテキストを読み込んで処理している。count($lines)は、$linesの要素数を指定するものである。countとは、引数に指定された配列の要素数を返す関数である。