ファイルの確認
file_exists~ファイルの存在確認
基本形
file_exists()
は引数で指定したファイル名のファイルが存在するかどうかを確認する。(PHP-manual)
file($filename)
戻り値はファイルの存在/不存在に従ってtrue/false。
is_readable~ファイルの読み込み可能性確認
is_readable()
はファイル名を指定したファイルが存在し読み込み可能かどうかを確認する。(PHP-manual)
is_readable($failename)
戻り値は指定したファイルが存在し読み込み可能な場合はtrue
、それ以外の場合にfalse
。
ファイルのオープン/クローズ
fopen~ファイルのオープン
基本形
多くのファイル操作では、最初にファイルをオープンしてファイルポインターリソースを取得する。ファイルの書き込みや読み込みはファイルリソースを通して行う。
fopen()
は第1引数にファイル名、第2引数にモードを指定する。モードは書き込み/読み込み、ファイルポインターの位置などに応じて所定の文字列で指定。(PHP-manual)
fopen($filename, $mode)
エラー処理
fopen()
の戻り値はresource
型だが、オープンに失敗した場合の戻り値はfalse
。このため、fopen()
のエラーチェックは明示的にfalse
であるかどうかを比較する。
1 2 3 4 5 |
if (fopen($filename, $mode) === false) { エラー時の処理; } else { 成功時の処理; } |
flose~ファイルのクローズ
基本形
fopen()得られたファイルポインターリソースを引数に指定してファイルを閉じる。
flose($file)
エラー処理
fclose()
の戻り値はbool型で、処理の成功/失敗に応じてtrue/false
が返される。しかし、明示的にfclose()
に対するエラーチェックを行うのが一般的なのか(あるいはそうすべきなのか)どうか不明。
行単位の書き込み・読み込み
fwrite~行単位の書き込み
基本形
テキストを行単位で書き込むにはfwrite()
を使う。エラー処理を全て除いた基本的な流れは以下の通り。
fopen(ファイル名)
でファイルをオープンしてファイルハンドラーを取得- モードの指定は新規書き込み(
'w'
)、追加書き込み('a'
)など - PHP-manual
- モードの指定は新規書き込み(
fwrite(ファイルハンドラー, 行データ)
で行データを順次書き込み- 改行文字
\n
は付けられないので、必要に応じて追加書き込み - PHP-manual
- 改行文字
flcose(ファイルハンドラー)
でファイルをクローズ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php echo 'ファイル書き込み~基本'; // 書き込み用データ $data = [ 'シェパード', 'ゴールデンレトリバー', 'セントバーナード', 'ボーダーコリー', ]; // 書き込みファイル名 $filename = 'file.txt'; // 書き込み用でファイルをオープン $file = fopen($filename, 'w'); // 行単位で書き込み/行末には\nを加える foreach ($data as $item) { fwrite($file, $item."\n"); } // ファイルをクローズ fclose($file); ?> |
上の例では\n
を付加しており、出力ファイルの内容は以下のようになる。
1 2 3 4 |
シェパード ゴールデンレトリバー セントバーナード ボーダーコリー |
エラー処理
fwrite()
の戻り値はint
型で書き込んだバイト数を返すが、書き込みに失敗した場合の戻り値はfalse
。このため、fwrite()
のエラーチェックは明示的にfalse
であるかどうかを比較する。
1 2 3 4 5 |
if (fwrite($file, $string) === false) { エラー時の処理; } else { 成功時の処理; } |
fgets~行単位の読み込み
基本形
fgets()
は\n
で区切られた行単位でデータを読み込む。エラー処理を除いた基本的な流れは以下の通り。
fopen(ファイル名)
でファイルをオープンしてファイルハンドラーを取得- モードの指定は読込(
'r'
)など - PHP-manual
- モードの指定は読込(
fgets(ファイルハンドラー)
で行データを順次読み込み- 通常
while
文でファイルの最後に行きつくまで順次読み込む - PHP-manual
- 通常
flcose(ファイルハンドラー)
でファイルをクローズ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php // 読み込みファイル名 $filename = 'file.txt'; // ファイルが存在していて読込可能なことを確認 if (is_readable($filename)) { // 読込用でファイルをオープン $file = fopen($filename, 'r'); // 行単位で読み込み while ($line = fgets($file)) { echo $line, '<br>'; } // ファイルをクローズ fclose($file); } ?> |
このコードでは、最低限ファイルが存在して読み込み可能なことをis_readble()
でチェックしている。
また行データを読み込んだ後、ブラウザーで改行させるため<br>
を付加している。その表示結果は以下の通り。
1 2 3 4 |
シェパード ゴールデンレトリバー セントバーナード ボーダーコリー |
読み込み終了処理
fgets()
の戻り値はstring
型で読み込んだテキストを返すが、読み込むデータがない場合はfalse
。このため、fgets()
はのエラーチェックは明示的にfalse
であるかどうかを比較する。
1 2 3 |
while ($string = fgets($file) { 読み込みに付随した処理; } |
一括書き込み・読み込み
file_put_contents
基本形
file_put_contents()
は、ファイル名を直接指定してデータを一括して書き込む。(PHP-manual)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php echo 'file_put_content~基本'; $data = [ 'シェパード', 'ゴールデンレトリバー', 'セントバーナード', 'ボーダーコリー', ]; $filename = 'file.txt'; file_put_contents($filename, $data); ?> |
この例では配列を直接渡して全要素を書き出しているが、要素間に改行文字は挿入されず、連続して書き込まれる。
1 |
シェパードゴールデンレトリバーセントバーナードボーダーコリー |
要素ごとに行を区切る場合には、foreachで要素を取り出して改行文字\n
を付加して書き込む。ただしこのときは前のデータを上書きしないようにFILE_APPENDフラグを立てる必要があるが、そうすると既にファイルが存在している際に追加書き込みになってしまう。
1 2 3 |
foreach ($data as $line) { file_put_contents($filename, $line."\n", FILE_APPEND); } |
ファイルが存在しない(あるいは空のファイルが存在する)場合のファイルの内容は以下のようになる。
1 2 3 4 |
シェパード ゴールデンレトリバー セントバーナード ボーダーコリーエラー処理 |
エラー処理
file_put_contents()
の戻り値はint
型で書き込んだバイト数を返すが、書き込みに失敗した場合の戻り値はfalse
。このため、file_put_contents()
のエラーチェックは明示的にfalse
であるかどうかを比較する。
1 2 3 4 5 |
if (file_put_contents($file, $data) === false) { エラー時の処理; } else { 成功時の処理; } |
file_get_contents
基本形
file_get_contents()
はファイル名を指定してその内容を一つの変数に読み込む。(PHP-manual)
1 2 3 4 5 6 7 |
<?php $filename = 'file.txt'; $content = file_get_contents($filename); echo $content; ?> |
改行文字\n
もそのまま読み込まれるが、ブラウザーでは反映されないため、上のコードの表示結果は以下のようになる。
1 |
シェパード ゴールデンレトリバー セントバーナード ボーダーコリー |
一括取得されたテキストをブラウザー上で改行させたい場合には、以下のように\n
を<br>
に置き換えるとよい。
1 |
echo str_replace("\n", '<br>', $content); |
エラー処理
file_get_contents()
の戻り値はstring
型で読み込んだデータを返すが、読み込みに失敗した場合の戻り値はfalse
。このため、file_get_contents()
のエラーチェックは明示的にfalse
であるかどうかを比較する。
1 2 3 4 5 |
if (($string = file_get_contents($file)) === false) { エラー時の処理; } else { 成功時の処理; } |
readfile
基本形
readfile()
はファイルの内容を一括して読み込み、それを直接表示する。(PHP-manual)
1 2 3 4 5 |
<?php $filename = 'file.txt'; readfile($filename); ?> |
改行文字はブラウザーでは反映されないため、行単位で区切られたファイルでも表示は以下のようになる。
1 |
シェパード ゴールデンレトリバー セントバーナード ボーダーコリー |
エラー処理
readfile()
の戻り値はint
型で読み込んだデータのバイト数を返すが、読み込みに失敗した場合の戻り値はfalse
。このため、file_get_contents()
のエラーチェックは明示的にfalse
であるかどうかを比較する。
1 2 3 4 5 |
if (readfile($file) === false) { エラー時の処理; } else { 成功時の処理; } |
CSVファイルの
書き込み・読み込み
fputcsv
基本形
fputcsv()
は配列データをCSVファイルとして書き込む。基本の流れはfwrite()
と同じ。(PHP-mannual)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php // fputcsvへのデータは2次元配列で与える $data = [ ['名前', '血液型', '身長'], ['伊藤', 'A', '172'], ['後藤', 'O', '162'], ['斉藤', 'B', '180'], ['内藤', 'AB', '168'], ]; $filename = 'file.csv'; $file = fopen($filename, 'w'); // 2次元配列から行配列を取り出してfputcsv foreach ($data as $field) { fputcsv($file, $field); } fclose($file); ?> |
上記のコードで配列をCSVとして書き込んだファイルの内容は以下の通り。
1 2 3 4 5 |
名前,血液型,身長 伊藤,A,172 後藤,O,162 斉藤,B,180 内藤,AB,168 |
エラー処理
fputcsv()
の戻り値はint
型で書き込んだ文字数を返すが、書き込みに失敗した場合の戻り値はfalse
。このため、file_put_contents()
のエラーチェックは明示的にfalse
であるかどうかを比較する。
1 2 3 4 5 |
if (fputcsv($file, $data) === false) { エラー時の処理; } else { 成功時の処理; } |
fgetcsv
基本形
fgetcsv()
はCSVからデータを読み込む。読み込みは行ごとに行われ、1つの行(フィールドは)カンマ(あるいは指定した文字)で区切られたデータごとに分けられ、1次元の配列として返される。(PHP-manual)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $filename = 'file.csv'; $file = fopen($filename, 'r'); // fgetcsvは行単位のフィールドで読み込む while ($field = fgetcsv($file)) { // フィールドデータは1次元配列として読み込まれる foreach ($field as $item) { echo $item, ' '; } echo '<br>'; } fclose($file); ?> |
上記コードの表示結果は以下の通り。
1 2 3 4 5 |
名前 血液型 身長 伊藤 A 172 後藤 O 162 斉藤 B 180 内藤 AB 168 |
エラー処理
rgetcsv()
の戻り値は読み込んだ行のデータの数値展示配列だが、無効なハンドルを受け取った場合はnull
、ファイル終端に達したときやその他のエラーの場合はfalse
を返す。このため、fgetcsv()
のエラーチェックは明示的にfalse
であるかどうかを比較する。
1 2 3 4 5 |
if (readfile($file) === false) { エラー時の処理; } else { 成功時の処理; } |