
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に代入された数値と上記の変数の数値を比較してアウトプットします。
以上です。
何かと応用がききそうなので、研究したいと思います。