CSVファイルを読み込み、そのCSVのデータを表示する方法を説明します。
現在のディレクトリ構造

CSVファイル
今回読み込むCSVファイルは日本郵便の郵便番号データ(広島県)を使わせて頂きました。

ソースコード
下記のようなソースコードにすることで全てのデータの「1列目と2列目」(列=カラム)を表示することが出来ます。
index.php $file_path = './zipcode.csv'; // zipcode.csvの文字エンコーディング 読み込んだSJISのデータをUTF-8に変換して保存 //file_put_contents($file_path, mb_convert_encoding(file_get_contents($file_path), 'UTF-8', 'SJIS')); //CSVファイル読み込み $file = new SplFileObject($file_path); $file->setFlags(SplFileObject::READ_CSV); foreach ($file as $column) {echo $column[1].' '; echo $column[2].'<br>'; }
出力結果

ソースコード軽く説明
// zipcode.csvの文字エンコーディング 読み込んだSJISのデータをUTF-8に変換して保存 //file_put_contents($file_path, mb_convert_encoding(file_get_contents($file_path), 'UTF-8', 'SJIS'));
こちらはコメントの通りで「SJISのデータをUTF-8に変換」しています。コメントアウトしている理由は1回しか「SJISのデータをUTF-8に変換(文字エンコーディング)」をしてはいけないからです。何度も実行すると文字化けが発生します。1回目実行時のみコメントを外して2回目以降は「コメントアウトをする」か「この記述を削除」すれば大丈夫です。
これよりも良い文字エンコーディングの方法があると思いますのでそちらを採用しても良いと思います。
$file_path = './zipcode.csv'; $file = new SplFileObject($file_path); $file->setFlags(SplFileObject::READ_CSV);
この3行でCSVファイルを取得してファイルのデータを読み込んでいます。
foreach ($file as $column) { echo $column[1].' '; echo $column[2].'<br>'; }
その後foreach文で全てのデータを回してカラム1とカラム2のみを取得しました。
■参考リンク
PHP: SplFileObject::setFlags - Manual
入力した郵便番号に当てはまる住所を表示するやり方
<input>に入力した郵便番号を$_POSTで送信し、CSVファイルにその郵便番号が存在するのか調べています。存在した場合は「住所」を。存在しなかった場合は「エラー」と表示させます。
classを使用して制作し、__constructに検索する郵便番号を入れています。
index.php <?php class Address { public $zipcode = ''; public function __construct($zipcode) { $this->zipcode = $zipcode; } function search_execution() { $file_path = './zipcode.csv'; // zipcode.csvの文字エンコーディング 読み込んだSJISのデータをUTF-8に変換して保存 //file_put_contents($file_path, mb_convert_encoding(file_get_contents($file_path), 'UTF-8', 'SJIS')); //CSVファイルデータ取得 $file = new SplFileObject($file_path); $file->setFlags(SplFileObject::READ_CSV); $hit = 0; foreach ($file as $column) { //CSVファイル内の郵便番号と一致するかどうか確認 if($column[2] == $this->zipcode){ $hit++; global $input_value_address; $input_value_address = $column[6].$column[7].$column[8]; } } if($hit == 0){ echo 'エラー : 検索した郵便番号はヒットしませんでした'.'<br>'; } } }//class Address終わり ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>タイトル</title> </head> <body> <form action="index.php" method="POST"> <label>郵便番号: <input type="text" name="zipcode" placeholder="例:1234567"></label> <input type="submit" value="検索"> </form> <?php if($_POST['zipcode']){ $zipcode = htmlspecialchars($_POST['zipcode'], ENT_QUOTES, "UTF-8"); $search = new Address($zipcode); $search->search_execution(); } ?> <label>住所入力欄:<input type="text" size="80" value="<?php echo $input_value_address;?>"></label> </body> </html>
全部の説明はしません。検索ボタンをクリックしてからの動作をほんの少しだけ説明します。
ページ下部のHTMLの部分をご覧下さい。この処理は赤→青→緑の順で行われています。
- 赤:zipcodeが送信されたか確認
- 青:Addressクラスを使用し、コンストラクタの引数に$_POST[‘zipcode’]($zipcode)を代入
- 緑:Addressクラスのsearch_execution()を実行し、郵便番号がヒットすれば$input_value_addressを出力、ヒットしなければエラーを出力
コメント