郵便番号と住所の組み合わせバリデーション
郵便番号と都道府県/市区町村の組み合わせによるバリデーションについて
日本郵便の郵便番号データダウンロードからCSVをダウンロード。
PHP
/**
*
* 郵便番号と住所の組み合わせバリデーション
*
* @param int $zip
* @param int $state
* @param string $city
* @return boolean
*/
function validateZip($zip, $state, $city)
{
$code = parse_ini_file('config/code.ini', true);
$state_csv = $code['STATE_CSV'];
// 都道府県毎の郵便番号CSV
if (array_key_exists($state, $state_csv)) {
$file_name = 'library/' . $state_csv[$state] . '.CSV';
}
$fp = @fopen($file_name, 'r');
// CSV処理
$i = 0;
while (($buffer = fgetcsv($fp, 200, ',')) !== FALSE) {
// 郵便番号
$data[$i]['zip'] = $buffer[2];
// 市区町村
$data[$i]['city'] = mb_convert_encoding($buffer[7], 'UTF-8', 'SJIS');
// 通常対応のみ 1020072/千代田区
// if ($zip == $data[$i]['zip'] && $city == $data[$i]['city']) {
// return TRUE;
// }
// 事業所対応 102xxxx/千代田区
if (substr($zip, 0, 3) == substr($data[$i]['zip'], 0, 3) && $city == $data[$i]['city']) {
return TRUE;
}
$i++;
}
fclose($fp);
return FALSE;
}
東京都(13TOKYO.CSV)
CSV
13101,"100 ","1000000","トウキョウト","チヨダク","イカニケイサイガナイバアイ","東京都","千代田区","以下に掲載がない場合",0,0,0,0,0,0
13101,"102 ","1020072","トウキョウト","チヨダク","イイダバシ","東京都","千代田区","飯田橋",0,0,1,0,0,0
13101,"102 ","1020082","トウキョウト","チヨダク","イチバンチョウ","東京都","千代田区","一番町",0,0,0,0,0,0
(略)
13421,"10021","1002100","トウキョウト","オガサワラムラ","イカニケイサイガナイバアイ","東京都","小笠原村","以下に掲載がない場合",0,0,0,0,0,0
13421,"10021","1002101","トウキョウト","オガサワラムラ","チチジマ","東京都","小笠原村","父島",0,0,0,0,0,0
13421,"10022","1002211","トウキョウト","オガサワラムラ","ハハジマ","東京都","小笠原村","母島",0,0,0,0,0,0
事業所の郵便番号は都道府県毎の郵便番号CSVとは別のCSVで保持されており、事業者の希望により掲載されていない番号があるため、前3桁の郵便番号と市区町村をマッチして判定。
INI
[STATE_CSV]
1 = "01hokkai"
2 = "02aomori"
3 = "03iwate"
4 = "04miyagi"
5 = "05akita"
6 = "06yamaga"
7 = "07fukush"
8 = "08ibarak"
9 = "09tochig"
10 = "10gumma"
11 = "11saitam"
12 = "12chiba"
13 = "13tokyo"
14 = "14kanaga"
15 = "15niigat"
16 = "16toyama"
17 = "17ishika"
18 = "18fukui"
19 = "19yamana"
20 = "20nagano"
21 = "21gifu"
22 = "22shizuo"
23 = "23aichi"
24 = "24mie"
25 = "25shiga"
26 = "26kyouto"
27 = "27osaka"
28 = "28hyogo"
29 = "29nara"
30 = "30wakaya"
31 = "31tottor"
32 = "32shiman"
33 = "33okayam"
34 = "34hirosh"
35 = "35yamagu"
36 = "36tokush"
37 = "37kagawa"
38 = "38ehime"
39 = "39kochi"
40 = "40fukuok"
41 = "41saga"
42 = "42nagasa"
43 = "43kumamo"
44 = "44oita"
45 = "45miyaza"
46 = "46kagosh"
47 = "47okinaw"
サンプルは平成25年1月31日更新版を使用。埼玉、千葉、東京、神奈川のみ対応。
サンプル
郵便番号データのCSVは毎月25日以降に更新されているようなので、wgetでダウンロードさせる設定をCronに設定して運用。
2015年くらいまでlzh形式でも配布されていましたが今はzip形式のみになっていました。
2010年に国産の圧縮形式「LZH」のUNLHA32.DLLの開発中止へ、LZH形式使用中止を呼びかけで結構騒がれたのに、まだlzh形式で配布してるんですね。(zip形式もあります)