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とは、引数に指定された配列の要素数を返す関数である。