Q1.以下のcsvファイルをダウンロードし株価一覧を表示せよ。
「実行例」

「解答例」
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>
コメント