PHPで住所から郵便番号を求める

(1/1)
PHPで住所から郵便番号を求める
前回につづき「ZIP SEARCH API SERVICE 「JIS X0401」対応版」(IW3 PROJECT)を用い、住所から郵便番号を表示するPHPプログラムを作ってみることにする。
(2022年1月15日)PHP8対応,リファラ・チェック改良

目次

サンプル・プログラム

圧縮ファイルの内容
address2zip.phpサンプル・プログラム本体

ZIP SEARCH API SERVICE 「JIS X0401」対応版

ZIP SEARCH API SERVICE 「JIS X0401」対応版」は、入力パラメータ(IN)として GETを、出力結果(OUT)がJSON形式で戻るというAPIである。
利用にあたっては、このWebAPIの 利用規約を遵守すること。
WebAPI:都道府県リスト取得
URL
http://api.thni.net/jzip/X0401/JSONP/{1}/{2}.js
応答データ構造(json) 繰り返し name 都道府県名 kana フリガナ
WebAPI:市町村リスト取得
URL
https://api.thni.net/jzip/X0401/JSONP/J/{1}/city_index.js

入力パラメータ
フィールド名 要否 内  容
1 必須 都道府県名。WebAPI:都道府県リスト取得で取得した文字列。
応答データ構造(json) 繰り返し name 市町村名 kana フリガナ
WebAPI:町域リスト取得
URL
https://api.thni.net/jzip/X0401/JSONP/J/{1}/{2}/street_index.js

入力パラメータ
フィールド名 要否 内  容
1 必須 都道府県名。WebAPI:都道府県リスト取得で取得した文字列。
2 必須 市町村名。WebAPI:市町村リスト取得で取得した文字列。
応答データ構造(json) 繰り返し name 町域名 kana フリガナ
WebAPI:郵便番号取得
URL
https://api.thni.net/jzip/X0401/JSONP/J/{1}/{2}/{3}.js

入力パラメータ
フィールド名 要否 内  容
1 必須 都道府県名。WebAPI:都道府県リスト取得で取得した文字列。
2 必須 市町村名。WebAPI:市町村リスト取得で取得した文字列。
3 必須 町域名。WebAPI:町域リスト取得で取得した文字列。
応答データ構造(json) zipcode 郵便番号 state 都道府県 city 市町村 street 町域

解説:郵便番号取得

0234: /**
0235:  * 都道府県から郵便番号を求める WebAPI URL
0236:  * @param   string $state  都道府県
0237:  * @param   string $city   市町村
0238:  * @param   string $street 町域
0239:  * @return  string WebAPI URL / FALSE
0240: */
0241: function getURL_zip($state$city$street) {
0242:     $state  = urlencode($state);
0243:     $city   = urlencode($city);
0244:     $street = urlencode($street);
0245:     return "http://api.thni.net/jzip/X0401/JSON/J/{$state}/{$city}/{$street}.js";
0246: }

0248: /**
0249:  * 都道府県から郵便番号を求める
0250:  * @param   string $state 都道府県
0251:  * @param   string $city  市町村
0252:  * @param   string $street 町域
0253:  * @return  string 郵便番号
0254: */
0255: function get_zip($state$city$street) {
0256:     $url = getURL_zip($state$city$street);       //リクエストURL
0257:     if ($url == FALSE)  return FALSE;
0258: 
0259:     $json = @file_get_contents($url);
0260:     if ($json == FALSEreturn FALSE;
0261: 
0262:     $arr = json_decode($json);
0263:     return isset($arr->zipcode) ?  (string)$arr->zipcode : FALSE;
0264: }

ユーザー関数 getURL_zip は、都道府県、市町村、町域から郵便番号を求めるWebAPIのURLを返す。

ユーザー関数 get_zip はWebAPIを呼び出し、都道府県、市町村、町域から郵便番号を求める。処理エラーの場合は FALSE を返す。

これ以外の部分は、いままで紹介したプログラムと同じである。

解説:JavaScript制御

0135: /**
0136:  * 都道府県リストを求める WebAPI URL
0137:  * @return  string WebAPI URL / FALSE
0138: */
0139: function getURL_state() {
0140:     return 'http://api.thni.net/jzip/X0401/JSON/J/state_index.js';
0141: }

0143: /**
0144:  * 都道府県リストを求める
0145:  * @param   array  $items 情報を格納する配列
0146:  * @return  bool TRUE/FALSE
0147: */
0148: function get_state(&$items) {
0149:     $url = getURL_state();           //リクエストURL
0150:     if ($url == FALSE)  return FALSE;
0151: 
0152:     $json = @file_get_contents($url);
0153:     if ($json == FALSEreturn FALSE;
0154: 
0155:     $arr = json_decode($json);
0156:     if (count($arr) < 1)    return FALSE;
0157: 
0158:     foreach ($arr as $val) {
0159:         $items[] = (string)$val->name;
0160:     }
0161: 
0162:     return TRUE;
0163: }

0165: /**
0166:  * 都道府県から市町村リストを求める WebAPI URL
0167:  * @param   string $state 都道府県
0168:  * @return  string WebAPI URL / FALSE
0169: */
0170: function getURL_city($state) {
0171:     $state = urlencode($state);
0172:     return "http://api.thni.net/jzip/X0401/JSON/J/{$state}/city_index.js";
0173: }

0175: /**
0176:  * 都道府県から市町村リストを求める
0177:  * @param   string $state 都道府県
0178:  * @param   array  $items 情報を格納する配列
0179:  * @return  bool TRUE/FALSE
0180: */
0181: function get_city($state, &$items) {
0182:     $url = getURL_city($state);          //リクエストURL
0183:     if ($url == FALSE)  return FALSE;
0184: 
0185:     $json = @file_get_contents($url);
0186:     if ($json == FALSEreturn FALSE;
0187: 
0188:     $arr = json_decode($json);
0189:     if (count($arr) < 1)    return FALSE;
0190: 
0191:     foreach ($arr as $val) {
0192:         $items[] = (string)$val->name;
0193:     }
0194: 
0195:     return TRUE;
0196: }

0198: /**
0199:  * 都道府県から町域リストを求める WebAPI URL
0200:  * @param   string $state 都道府県
0201:  * @param   string $city  市町村
0202:  * @return  string WebAPI URL / FALSE
0203: */
0204: function getURL_street($state$city) {
0205:     $state = urlencode($state);
0206:     $city  = urlencode($city);
0207:     return "http://api.thni.net/jzip/X0401/JSON/J/{$state}/{$city}/street_index.js";
0208: }

0210: /**
0211:  * 都道府県から町域リストを求める
0212:  * @param   string $state 都道府県
0213:  * @param   string $city  市町村
0214:  * @param   array  $items 情報を格納する配列
0215:  * @return  bool TRUE/FALSE
0216: */
0217: function get_street($state$city, &$items) {
0218:     $url = getURL_street($state$city);         //リクエストURL
0219:     if ($url == FALSE)  return FALSE;
0220: 
0221:     $json = @file_get_contents($url);
0222:     if ($json == FALSEreturn FALSE;
0223: 
0224:     $arr = json_decode($json);
0225:     if (count($arr) < 1)    return FALSE;
0226: 
0227:     foreach ($arr as $val) {
0228:         $items[] = (string)$val->name;
0229:     }
0230: 
0231:     return TRUE;
0232: }

0402: //検索実行
0403: $url = getURL_state();
0404: $res = get_state($items['state']);
0405: if (! $res) {
0406:     $message = 'error > 都道府県が検索できません.';
0407: else if ($state != '') {
0408:     $url = getURL_city($state);
0409:     $res = get_city($state$items['city']);
0410:     if (! $res) {
0411:         $message = 'error > この都道府県では検索できません.';
0412:     } else if ($city != '') {
0413:         $url = getURL_street($state$city);
0414:         $res = get_street($state$city$items['street']);
0415:         if (! $res) {
0416:             $message = 'error > この市町村では検索できません.';
0417:         } else if ($street != '') {
0418:             $url = getURL_zip($state$city$street);
0419:             $zip = get_zip($state$city$street);
0420:             if (! $res) {
0421:                 $message = 'error > 郵便番号が検索できません.';
0422:             }
0423:         }
0424:     }
0425: }

都道府県、市町村、町域の3つはプルダウンにし、各々を選ぶ都度、WebAPIをコールして右側のリストを更新していくようにする。プルダウンが変化する都度、JavaScriptでPHPスクリプトを呼び出すようにしてある。
都道府県、市町村、町域の3つが選択されたら、郵便番号を取得する。

参考サイト

(この項おわり)
header