Q1.以下のcsvファイルをダウンロードし株価一覧を表示せよ。
下からダウンロード
1 ファイル 303.12 KB
「実行例」
「解答例」
1.ダウンロードしたstocks_2017-08-16.csvファイルをindex.phpと同じ階層に保存し、index.phpを以下のように編集する。
<?php //ファイルを開く $fp=fopen('stocks_2017-08-16.csv','r'); $data=[]; while($row=fgetcsv($fp)){ $data[]=$row; } //print_r($data); fclose($fp); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>PHPLesson</title> </head> <body> <table border="1"> <?php foreach($data as $record):?> <tr> <?php foreach($record as $val):?> <td><?=$val?></td> <?php endforeach;?> </tr> <?php endforeach;?> </table> </body> </html>
2.実行してみよう。株価の表が表示されれば成功だ。
[解説]
$fp=fopen('stocks_2017-08-16.csv','r');
第1引数のファイルを、第2引数のモードで開き、戻り値としてリソースを返す。
モードは以下。
モード | 説明 |
---|---|
r | 読み込みのみで開きます。ファイルポインタはファイルの先頭におきます。 |
r+ | 読み書き可能な状態で開きます。ファイルポインタはファイルの先頭におきます。 |
w | 書き込みのみで開きます。ファイルポインタはファイルの先頭におき、ファイルサイズをゼロにします。ファイルが存在しない場合は新規作成します。 |
w+ | 読み書き可能な状態で開きます。ファイルポインタはファイルの先頭におき、ファイルサイズをゼロにします。ファイルが存在しない場合は新規作成します。 |
a | 追加書き込みモードです。ファイルポインタをファイルの終端におき、ファイルが存在しない場合は新規作成します。 |
a+ | 追加書き込み・読み取りが可能なモードです。ファイルポインタをファイルの終端におき、ファイルが存在しない場合は新規作成します。 |
x | 書き込みのみで開きます。ファイルポインタはファイルの先頭におきます。ファイルが存在するとfopen関数は失敗し、E_WARNINGレベルのエラーを出力します。ファイルが存在しない場合は新規作成します。 |
x+ | 読み込み・書き込みが可能なモードです。ファイルポインタはファイルの先頭におきます。ファイルが存在するとfopen関数は失敗し、E_WARNINGレベルのエラーを出力します。ファイルが存在しない場合は新規作成します。 |
$data=[];
空の配列を宣言
while($row=fgetcsv($fp)){ $data[]=$row; }
一行ずつ読み込みながらそれをカンマでスプリットし、そこでできた配列を$rowに代入している。
その1行文のデータ$rowを$dataに追加していく。
その処理を文末まで繰り返している。
//print_r($data);
ここではコメントにしているが、print_r(配列)
は配列がどうなっているのかを視覚的に確認したい場合に便利だ。実行後、ブラウザからソースを見るを選択すると以下のようにきれいに表示される。
[別解]
SplFileObjectを使った作例
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>株価一覧</title> <link rel="stylesheet" href="../css/style.css"> <style> body{ font-size:10px; } table{ border-collapse:collapse; } table tr *{ border:1px solid #777; } tr:nth-child(even) { background-color:#dff0ff; } </style> </head> <body> <div> <?php $filename="stocks_2017-08-16.csv"; try{ $fo=new SplFileObject($filename,"rb"); }catch(Exception $e){ echo '<span class="error">エラーがありました。</span><br>'; echo $e->getMessage(); exit(); } $fo->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE ); ?> <table> <?php foreach($fo as $row):?> <tr> <?php foreach($row as $val):?> <td><?=htmlspecialchars($val)?></td> <?php endforeach;?> </tr> <?php endforeach;?> </table> </div> </body> </html>
コメント