PHP4(ファイル読み込み、csvパース)

PHP

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


「実行例」

「解答例」
1.ダウンロードしたstocks_2017-08-16.csvファイルをindex.phpと同じ階層に保存し、index.phpを以下のように編集する。

01<?php
02//ファイルを開く
03$fp=fopen('stocks_2017-08-16.csv','r');
04$data=[];
05while($row=fgetcsv($fp)){
06  $data[]=$row;
07}
08//print_r($data);
09fclose($fp);
10 
11?>
12<!DOCTYPE html>
13<html>
14<head>
15<meta charset="utf-8">
16<title>PHPLesson</title>
17</head>
18<body>
19<table border="1">
20<?php foreach($data as $record):?>
21  <tr>
22<?php foreach($record as $val):?>
23  <td><?=$val?></td>
24<?php endforeach;?>
25</tr>
26<?php endforeach;?>
27</table>
28</body>
29</html>

2.実行してみよう。株価の表が表示されれば成功だ。
[解説]

$fp=fopen('stocks_2017-08-16.csv','r');

第1引数のファイルを、第2引数のモードで開き、戻り値としてリソースを返す。
モードは以下。

fopen()関数で指定可能なモード
モード 説明
r 読み込みのみで開きます。ファイルポインタはファイルの先頭におきます。
r+ 読み書き可能な状態で開きます。ファイルポインタはファイルの先頭におきます。
w 書き込みのみで開きます。ファイルポインタはファイルの先頭におき、ファイルサイズをゼロにします。ファイルが存在しない場合は新規作成します。
w+ 読み書き可能な状態で開きます。ファイルポインタはファイルの先頭におき、ファイルサイズをゼロにします。ファイルが存在しない場合は新規作成します。
a 追加書き込みモードです。ファイルポインタをファイルの終端におき、ファイルが存在しない場合は新規作成します。
a+ 追加書き込み・読み取りが可能なモードです。ファイルポインタをファイルの終端におき、ファイルが存在しない場合は新規作成します。
x 書き込みのみで開きます。ファイルポインタはファイルの先頭におきます。ファイルが存在するとfopen関数は失敗し、E_WARNINGレベルのエラーを出力します。ファイルが存在しない場合は新規作成します。
x+ 読み込み・書き込みが可能なモードです。ファイルポインタはファイルの先頭におきます。ファイルが存在するとfopen関数は失敗し、E_WARNINGレベルのエラーを出力します。ファイルが存在しない場合は新規作成します。

空の配列を宣言

while($row=fgetcsv($fp)){
  $data[]=$row;
}

一行ずつ読み込みながらそれをカンマでスプリットし、そこでできた配列を$rowに代入している。
その1行文のデータ$rowを$dataに追加していく。
その処理を文末まで繰り返している。

ここではコメントにしているが、print_r(配列)は配列がどうなっているのかを視覚的に確認したい場合に便利だ。実行後、ブラウザからソースを見るを選択すると以下のようにきれいに表示される。

[別解]
SplFileObjectを使った作例

01<!DOCTYPE html>
02<html lang="ja">
03<head>
04  <meta charset="utf-8">
05  <title>株価一覧</title>
06  <link rel="stylesheet" href="../css/style.css">
07  <style>
08  body{
09    font-size:10px;
10  }
11  table{
12    border-collapse:collapse;
13  }
14  table tr *{
15    border:1px solid #777;
16  }
17  tr:nth-child(even) {
18    background-color:#dff0ff;
19  }
20  </style>
21</head>
22<body>
23  <div>
24    <?php
25    $filename="stocks_2017-08-16.csv";
26    try{
27      $fo=new SplFileObject($filename,"rb");
28    }catch(Exception $e){
29      echo '<span class="error">エラーがありました。</span><br>';
30      echo $e->getMessage();
31      exit();
32    }
33    $fo->setFlags(SplFileObject::READ_CSV
34    | SplFileObject::READ_AHEAD
35    | SplFileObject::SKIP_EMPTY
36    | SplFileObject::DROP_NEW_LINE
37  );
38  ?>
39  <table>
40    <?php foreach($fo as $row):?>
41      <tr>
42        <?php foreach($row as $val):?>
43        <td><?=htmlspecialchars($val)?></td>
44        <?php endforeach;?>
45      </tr>
46    <?php endforeach;?>
47  </table>
48</div>
49</body>
50</html>

コメント

タイトルとURLをコピーしました