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

PHP

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引数のモードで開き、戻り値としてリソースを返す。
モードは以下。

fopen()関数で指定可能なモード
モード 説明
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>

コメント

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