pagetop

BLOG

phpでCSVデータを下から読み込む

  • HOME

  • BLOG

  • phpでCSVデータを下から読み込む

Article

phpでCSVデータを下から読み込む

PHP

CSVデータを下から読み込むためのphpをメモします。
フォーム等を作成した場合、登録情報を1行1データでCSVに書き込むのですが、最新の情報は最も下に書き込まれる場合、そのCSVデータをwebで読み込むと1行目(最も古い情報)からはじまります。
それではデータが多い場合、ファーストビューで閲覧できず不便だということで最新のデータを最も上に読み込むのphpをメモしました。

 

CSVデータフォーマット

CSVデータのフォーマットは以下を想定します。

data.csv
No.1,DATA1
No.2,DATA2
No.3,DATA3
No.4,DATA4
No.5,DATA5
No.6,DATA6
No.7,DATA7
No.8,DATA8
No.9,DATA9
・
・
・
・
No.59,DATA59
No.60,DATA60

No.1,DATA1が書き込まれた最も古いデータとします。No.60,DATA60が最新のデータとします。
data.csvはphpファイルと同じディレクトリに設置します。

 

phpプログラム

それではphpを記述します。

sample_1.php
<table cellpadding="0" cellspacing="0">
<tr>
<th>No</th>
<th>Name</th>
</tr>
<?php

$Data = array_reverse(file('data.csv'));
$ct = 0;

foreach ($Data as $line) {
$item = explode(",", rtrim($line));
echo <<< EOM
<tr>
<td>$item[0]</td>
<td>$item[1]</td>
</tr>
EOM;
if (++$ct >= 20) {
break;
}
}

?>

</table>

これを実行すると、最後の行から20行目までを取得しアウトプットします。

デモ

すべてのデータをアウトプットする場合は以下のようにします。

foreach ($Data as $line) {
$item = explode(",", rtrim($line));
echo <<< EOM
<tr>
<td>$item[0]</td>
<td>$item[1]</td>
</tr>
EOM;
}

 

GETを組み合わせてデータを複数ページに分ける

最新の20件の情報を取得した場合、当然その他のデータも閲覧する必要があります。そこで、GETの情報を取得してデータを1ページ20件づつ複数表示します。

sample_2.php
<table cellpadding="0" cellspacing="0">
<tr>
<th>No</th>
<th>Name</th>
</tr>
<?php
if(isset($_GET['page']) && is_numeric($_GET['page'])){
$page = (int)$_GET['page'];
}else{
$page = 1;
}

$page_start = (($page - 1) * 20) + 0;
$page_max = $page * 20;

$Data = array_reverse(file('data.csv'));
$ct = 0;

foreach ($Data as $line) {
$item = explode(",", rtrim($line));
$item[4] = mb_convert_kana($item[4],"KV","UTF-8");
if($ct < $page_start){
$ct++;
continue;
}
elseif(++$ct <= $page_max){
echo <<< EOM
<tr>
<td>$item[0]</td>
<td>$item[1]</td>
</tr>
EOM;
}
elseif (++$ct >= $page_max) {
break;
}
}

?>

</table>

GETの変数$pageの数字を取得します。$pageの初期値は1とします。

URLは以下のようになります。

https://www.sample.com/csv_read_under/sample_2.php?page=1

 

$pageに入る数字で1ページあたり20件のデータをアウトプットします。1は最新データで大きくなる程古いデータになります。

 

次にはじまりのページと、$pageに応じて1ページあたり表示される件数と順番を変数に代入します。

$page_start = (($page - 1) * 20) + 0;
$page_max = $page * 20;

あとは$ctに代入された数値と上記の変数の数値を比較してアウトプットします。

デモ

 

以上です。
何かと応用がききそうなので、研究したいと思います。

Spread the love