郵便番号から住所を取得する処理(PHP)

問い合わせフォームなどで郵便番号から住所を自動で表示する項目は非常に便利です。しかし住所を最初から手入力される項目はコンバージョン率が落ちるといわれています。ユーザビリティを高めるために郵便番号から住所を自動で取得する処理を追加する方法を記載します。

サンプルソース

APIを利用することで郵便番号から都道府県・市区町村まで取得可能です。あとは番地を入力するだけで住所は完成となります。

// 郵便番号検索を行う。
function SEARCH_POSTNUM($POST_NUM) {
	if (strlen($POST_NUM) == 0) {
		return true;
	}
	// 郵便番号が7桁であるかチェック
	if (!CHK_LENGTH($POST_NUM, 7 , false)) {
		// 7桁でない場合はエラー
		return false;
	}

	// 郵便番号から住所を検索
	$POST_URL = "http://zipcloud.ibsnet.co.jp/api/search?zipcode=" . $POST_NUM;
	$json = file_get_contents($POST_URL);
	$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
	
	// 取得結果を配列に格納
	$arr = json_decode($json,true);

	if (is_null($arr['results'][0])) {
		// 郵便番号が取得できない場合はエラー
		return '郵便番号から住所を取得できません';
	}

	$prefecture = $arr['results'][0]['address1'];	// 県
	$city = $arr['results'][0]['address2'];			// 市区町村
	$city2 = $arr['results'][0]['address3'];		// 市区町村
	
	return $prefecture.$city.$city2;
}

上記ソースの内容を解説していきます。

解説

住所取得処理の部品化

住所を取得する処理はどこのページから呼ばれるかわからないので部品化しておきます。そうすることによってどこからでも呼び出すことができ、同じ結果を返すことができます。またプログラムの修正が発生した場合でも1か所修正するだけですべての住所取得処理に反映することができます。

function SEARCH_POSTNUM($POST_NUM) {

ここでは部品名(function名)を「SEARCH_POSTNUM」としています。また引数には郵便番号(ハイフンなし)を渡すようにしています。

桁数チェック

	if (strlen($POST_NUM) == 0) {
		return true;
	}

こちらでは桁数チェックを行っています。独自の桁数チェック部品に郵便番号を渡し、0桁(未入力)の場合は処理を終わらせるようにしています。

	// 郵便番号が7桁であるかチェック
	if (!CHK_LENGTH($POST_NUM, 7 , false)) {
		// 7桁でない場合はエラー
		return false;
	}

こちらも独自の桁数チェック部品により郵便番号が7桁であるかチェックしています。7桁でない場合は処理を異常終了させるようにfalesを返しています。

郵便番号送信

	// 郵便番号から住所を検索
	$POST_URL = "http://zipcloud.ibsnet.co.jp/api/search?zipcode=" . $POST_NUM;
	$json = file_get_contents($POST_URL);
	$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

所定のURLに郵便番号を引数を渡します。

そのURLからファイルの内容を全て文字列に読み込むようにします。

データはしっかり文字コード変換を行うことで文字化けすることを防ぎます。

住所取得

	// 取得結果を配列に格納
	$arr = json_decode($json,true);

取得し文字コードを変換したデータを配列変数に格納します。

エラー判定

	if (is_null($arr['results'][0])) {
		// 郵便番号が取得できない場合はエラー
		return '郵便番号から住所を取得できません';
	}

配列の1つ目がNULLの場合、住所情報が取得できていないためエラーで返すようにしています。住所情報が取得できない理由としては存在しない郵便番号を渡しているからと思います。もしくはAPIが正しく情報を返せない場合になります。

	$prefecture = $arr['results'][0]['address1'];	// 県
	$city = $arr['results'][0]['address2'];			// 市区町村
	$city2 = $arr['results'][0]['address3'];		// 市区町村
	
	return $prefecture.$city.$city2;

配列のうち、’address1’には都道府県情報が入っています。’address2’と’address3’には市区町村情報がありますので両方取得しましょう。これらをつなぎ合わせると住所が取得可能となります。