【PHP】CSVファイルのデータを取得し、カラムのデータを表示する方法 / 入力した郵便番号に当てはまる住所を表示するやり方も解説

CSVファイルを読み込み、そのCSVのデータを表示する方法を説明します。

現在のディレクトリ構造

 

CSVファイル

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

https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html

 

 

 

ソースコード

下記のようなソースコードにすることで全てのデータの「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の部分をご覧下さい。この処理はの順で行われています。

  1. 赤:zipcodeが送信されたか確認
  2. 青:Addressクラスを使用し、コンストラクタの引数に$_POST[‘zipcode’]($zipcode)を代入
  3. 緑:Addressクラスのsearch_execution()を実行し、郵便番号がヒットすれば$input_value_addressを出力、ヒットしなければエラーを出力

 

最終学歴高卒。実務未経験から自社開発&受託開発をしている企業に入社した、入社1年目のエンジニア。20代前半。
WordPress・PHP / Laravel・JavaScript

ひろきをフォローする

コメント

タイトルとURLをコピーしました