ウェブ、ショウジン

PHPでCSVデータを読み込んで内容を出力する

2009-11-7
Category
MySQL PHP

CSVファイル(カンマと改行でレコード及び各要素を区切ったデータ)をPHPで開いて読み込み、それらを出力するサンプル。
追記:2009/12/15 PHPでCSVデータを表示する(もうちょっとうまく?出来たので、こっちもメモっておいた)

新しい勤め先でちょっと必要になったので、初めて自分自身で最初から書いてみたという、自分としてはとてもエポックメイキングな出来事。(もっとスマートに、利便性高く書けるのだろうけど、とりあえずはこれでも、、なのだ)

あ行、か行といったように、それぞれを「あかさたな」で分けてCSVファイルを用意し、各語群にとばすリンクURL内にそれを指すキーをパラメータとして付加し、該当のCSVファイルを読み込むようにする。

htmlファイル:index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>CSVデータを読み込んで表示する</title>
</head>
<body>

<!-- リンクURL末尾に?を使って連想配列名=キー名としてパラメータを追加する -->
<!-- こうすることでグローバル変数$_GETの配列として要素を取り出すことが出来る -->
<!-- 引き渡された要素は$_GET[キー名]でアクセス出来る -->
<a href="list.php?gyo=a" title="あ行">あ行</a><br />
<a href="list.php?gyo=ka" title="か行">か行</a>

</body>
</html>

[adsenseSingleMid]

CSVデータ:a.csv, ka.csv

サンプルとして、簡単な三文字熟語を使用。各熟語とその「読み」「意味」をカンマで区切って記述。ひとつひとつのレコード(熟語)は改行で分ける。

a.csvの内容(あ行の語群)
合い言葉,あいことば,味方同士であらかじめ決めてある合図の言葉。
青海原,あおうなばら,青々として広い海。
青天井,あおてんじょう,青空。青空を天井に見立てていう言葉。

ka.csvの内容(か行の語群)
快気祝,かいきいわい,病気の全快を祝うこと。
街路樹,がいろじゅ,道路に沿って植えつらねた樹木。
案山子,かかし,鳥獣をおどしてその被害を防ぐために田畑に立てた人型。

phpソースファイル:include_csv.php

一覧ページと各熟語詳細ページで共用するスクリプトを外部ファイルとして作成。

<?php
// $_GETの要素として渡された値(行を判別する)を変数$gyoに代入
$gyo = $_GET['gyo'];

// あかさたな行を判別してCSVファイルを読み込む
// この例ではあ行とか行のみ
// $gyoの値が「a」だったらa.csvを読み込む、「ka」だったらka.csvを読み込む
if ($gyo == 'a') {
    define(csvfile, "a.csv");
} elseif ($gyo == 'ka') {
    define(csvfile, "ka.csv");
}

// CSVファイルデータを多次元配列(ネストされた配列)として格納
// 親(ひとつひとつの熟語のレコード)配列が$recordで、子(カンマで区切られた各要素)が$TextData
if (file_exists(csvfile) == false) {
    return false;
} else {
    $record = array();
    $TextData = file(csvfile);
    for ($i = 0; $i < sizeof($TextData); $i++) {
        $record[$i] = split(",", $TextData[$i]);
    }
}

phpソースファイル:list.php

各行の語群を一覧表示し、リンクをクリックすると熟語詳細ページへとぶ。

<?php
// CSVファイルの読み込みとそのデータ内容を多次元配列に格納するスクリプトを読み込む
include_once "include_csv.php";

// レコードの総件数を取得して変数$sumに代入
$sum = count($record);

// forループで回して全てのレコードにおける単語名そ出力
// リンクURLには単語名と読みと意味とレコードidをパラメータで付与
// こうすることでリンク先ページで各単語の各要素にアクセスすることが出来る
for ($i = 0; $i <= $sum; $i++) {
    echo '<a href="detail.php?tango=0&yomi=1&imi=2&id=' . $i . '&gyo=' . $gyo . '">' . $record[$i][0] . '</a><br />';
}

phpソースファイル:detail.php

熟語群一覧から各熟語をクリックしたら表示する熟語詳細ページ(熟語、読み、意味を表示)

<?php
// CSVファイルの読み込みとそのデータ内容を多次元配列に格納するスクリプトを読み込む
include_once "include_csv.php";

// $_GET変数で渡された配列の各要素の値をそれぞれ変数に代入
$tango = $_GET['tango']; // 熟語名
$yomi = $_GET['yomi']; // 読み
$imi = $_GET['imi']; // 意味
$id = $_GET['id']; // 配列recordの値(行のどの単語かを判別するための)
$gyo = $_GET['gyo']; // 行を判別するためのキーの値

// 熟語名・よみ・意味を出力
echo "熟語名:" . $record[$id][$tango] . "<br />";
echo "よみ:" . $record[$id][$yomi] . "<br />";
echo "意味:" . $record[$id][$imi] . "<br /><br />";

// 念のため配列の内容をデバッグ表示してみる
echo "▼前ページから引き渡された配列の内容をデバッグ表示してみる" . "<br />";/
print_r($_GET);

これで、index.htmlをブラウザで開いて、あ行なりか行なりのリンク文字列をクリックすると、CSVで用意されている各レコードを全て(行ごとに)表示して、各熟語名をクリックすると、該当する熟語の詳細(熟語名、読み、意味)を表示する。

もっとスマートにできるのだろうけれど、チュートリアルや写経で確認するといったやり方以外で、初めて仕事でプログラムを自分自身で最初から作成したというのがとてもいい経験になった気がする。

とくに配列(グローバル変数$_GETや$_POSTについても)に対する理解においては、今までのなぞっただけの「知識」じゃなくて、やっと利用できる、活用できる「知恵」になったような気がする。まだ入り口だけど。

基礎からのMySQL [基礎からのシリーズ] (プログラマの種シリーズ)
西沢 夢路
ソフトバンククリエイティブ
売り上げランキング: 3749

Categories

Tag Cloud

AdMob Android Apache centos CodeIgniter EC-CUBE facebookアプリ facebookページ feed Firefox Flash google googleanalytics htaccess iPad iPhone JavaScript lamp mobile nginx ogp pear php plugin rollover rss sendmail setting smarty ssh Titanium Mobile Titanium Studio tutorial ubuntu vim VirtualBox vmware vps Windows WordPress xampp youtube さくらインターネット アクセス解析 カスタム投稿