問題
解決策
PHPでのCSVファイルの読み込み
PHPでCSVファイルを読み込むには、「fopen」関数でCSVファイルを開き、「fgetscsv」関数でデータを取得して配列に格納し、一通りデータの参照が終えたら「fclose」関数でCSVファイルを閉じます。
CSVファイルの内訳の構成パターンは、1行目に各項目、2行目以降に行ごとでアイテム(内容)を想定しています。
CSVファイルの内容を配列に格納
CSVファイルを読み込み、データを配列に格納します。
<?php
setlocale(LC_ALL, 'ja_JP.UTF-8');
ini_set('auto_detect_line_endings', 1);
$row = 1;
$col = 1;
$itemlist = array(); // 項目情報用
$valuelist = array(); // 内容情報用
// ファイルが存在しているかチェックする
if (($handle = fopen("ファイルパス.datacsv", "r")) !== FALSE) {
// 1行ずつfgetcsv()関数を使って読み込む
while (($data = fgetcsv($handle,10000))) {
$col = 1;
foreach ($data as $value) {
$value = mb_convert_encoding($value, 'UTF-8', 'sjis-win');
if($row !== 1){
// 2行目以降ならば、項目情報用の配列の値を連想配列のキーとして、内容情報用の配列に格納
$valuelist[$row-1][$itemlist[$col-1]] = $value;
}else{
// 最初の行ならば、項目情報用の配列に値を格納
$itemlist[$col-1] = $value;
}
$col++;
}
$row++;
}
fclose($handle);
}
?>
データ格納用の配列として、
- 項目情報用
- セル情報用
の2つの配列を用意します。
データを格納していく流れ
- 「fopen」関数でCSVファイルの読み込み
「fgetcsv」関数でCSVファイル内のデータを一行ずつ処理
取得した1行分のデータを「foreach」でループ処理
- 最初の行の場合、項目情報用の配列にデータを格納
- 2行目以降の場合、項目情報用の配列の値を連想配列のキーとして、内容情報用の配列に格納
- 全ての読み込みが終わったら「fclose」関数でCSVファイルを閉じる。
データを格納し終えた2つの配列を使い、出力を行う。
格納した配列データを元に、出力を行います。
<section class="section">
<?php
foreach($valuelist as $row):
?>
<div id="row<?php echo $row["id"]; ?>" class="section-s">
<h3 class="subtitles"><?php echo $row["項目①"]; ?></h3>
<dl class="dl-list clearfix">
<dt>項目②</dt>
<dd><?php echo $row["項目②"]; ?></dd>
<dt>項目③</dt>
<dd><?php echo $row["項目③"]; ?></dd>
<dt>項目④</dt>
<dd><?php echo $row["項目④"]; ?></dd>
<dt>項目⑤</dt>
<dd><?php echo $row["項目⑤"]; ?></dd>
</dl>
</div>
<?php endforeach; ?>
</section>
データを出力していく流れ
セル情報を「foreach」で繰り返し処理
- $row[‘各項目名’]として、項目の順番を気にせずに出力が可能なので、適宜好きな形にマークアップを行う。
参考ページ
【[PHP]文字化けせずにCSVファイルを読み込み、配列に変換する | PHP Archive】
https://php-archive.net/php/csv-tsv-array/
【fgetcsv関数を利用してCSVファイルを読み込む】
https://noumenon-th.net/programming/2016/05/14/fgetcsv/
コメント