PHPで郵便番号から都道府県を判定するクラス
2021/10/13
2022/02/23
PHPで郵便番号から都道府県を判定する必要があり、調べたところ、以下のページを見付けた。
郵便番号は、上2桁で都道府県が決まらない。それどころか、7桁が同じでも都道府県が決まらないものもあるという、不思議な定義になっているようです。 KEN_ALL.CSV を調べて、郵便番号と住所(市区町村)を条件に、都道府県を特定するクラスを作りました。
厳密に正しい県を特定できなくても良いケースでは、第二引数の市町村は省略可能です。
<?php echo PostalCodeToPrefectureId::convert('4980000', '桑名郡木曽岬町'); // => 24 三重 echo PostalCodeToPrefectureId::convert('4980000', '弥富市'); // => 23 愛知 // 厳密に正しい県を特定できなくても良いケースでは、第二引数の市町村は省略可能です。 echo PostalCodeToPrefectureId::convert('4980000'); // => 23 愛知 |
<?php /** * 郵便番号を県番号に変換するクラス * * 郵便番号7桁だけでは、県を特定できないケースがある。 * そのため、address1の市町村の条件を元に、正しく県を判定するようにします。 */ class PostalCodeToPrefectureId { private static function getMap() { return [ '/^0185501/' => 2, // 青森 '/^3114411/' => 9, // 栃木 '/^3491221/' => 9, // 栃木 '/^3840097/' => 10, // 群馬 '/^3890121/' => 10, // 群馬 '/^3892261/' => 15, // 新潟 '/^4314121/' => 23, // 愛知 '/^4980000/' => function($address1){ return (mb_strstr($address1, '桑名郡') !== false) ? 24 : 23; }, // 三重か愛知 '/^49808/' => 24, // 三重 '/^520046/' => 26, // 京都 '/^5630801/' => 28, // 兵庫 '/^6180000/' => function($address1){ return (mb_strstr($address1, '三島郡') !== false) ? 27 : 26; }, // 大阪か京都 '/^618000[0-4]/' => 27, //大阪 '/^630027[1-2]/' => 27, //大阪 '/^6471271/' => 29, //奈良 '/^647132[1-5]/' => 24, //三重 '/^647158/' => 29, //奈良 '/^648030/' => 29, //奈良 '/^6840[1-4]/' => 32, //島根 '/^685/' => 32, //島根 '/^8115/' => 42, //長崎 '/^817/' => 42, //長崎 '/^8391421/' => 44, //大分 '/^84804/' => 42, //長崎 '/^8710000/' => function($address1){ return (mb_strstr($address1, '築上郡') !== false) ? 40 : 44; }, // 福岡か大分 '/^8710226/' => 40, //福岡 '/^8710[8-9]/' => 40, //福岡 '/^9220679/' => 18, //福井 '/^9390171/' => 17, //石川 '/^9498321/' => 20, //長野 '/^(00|0[4-9])/' => 1, // 北海道 '/^03/' => 2, // 青森県 '/^02/' => 3, // 岩手県 '/^98/' => 4, // 宮城県 '/^01/' => 5, // 秋田県 '/^99/' => 6, // 山形県 '/^9[6-7]/' => 7, // 福島県 '/^3[0-1]/' => 8, // 茨城県 '/^32/' => 9, // 栃木県 '/^37/' => 10, // 群馬県 '/^3[3-6]/' => 11, // 埼玉県 '/^2[6-9]/' => 12, // 千葉県 '/^(1[0-9]|20)/' => 13, // 東京都 '/^2[1-5]/' => 14, // 神奈川県 '/^9[4-5]/' => 15, // 新潟県 '/^93/' => 16, // 富山県 '/^92/' => 17, // 石川県 '/^91/' => 18, // 福井県 '/^40/' => 19, // 山梨県 '/^3[8-9]/' => 20, // 長野県 '/^50/' => 21, // 岐阜県 '/^4[1-3]/' => 22, // 静岡県 '/^4[4-9]/' => 23, // 愛知県 '/^51/' => 24, // 三重県 '/^52/' => 25, // 滋賀県 '/^6[0-2]/' => 26, // 京都府 '/^5[3-9]/' => 27, // 大阪府 '/^6[5-7]/' => 28, // 兵庫県 '/^63/' => 29, // 奈良県 '/^64/' => 30, // 和歌山県 '/^68/' => 31, // 鳥取県 '/^69/' => 32, // 島根県 '/^7[0-1]/' => 33, // 岡山県 '/^7[2-3]/' => 34, // 広島県 '/^7[4-5]/' => 35, // 山口県 '/^77/' => 36, // 徳島県 '/^76/' => 37, // 香川県 '/^79/' => 38, // 愛媛県 '/^78/' => 39, // 高知県 '/^8[0-3]/' => 40, // 福岡県 '/^84/' => 41, // 佐賀県 '/^85/' => 42, // 長崎県 '/^86/' => 43, // 熊本県 '/^87/' => 44, // 大分県 '/^88/' => 45, // 宮崎県 '/^89/' => 46, // 鹿児島県 '/^90/' => 47, // 沖縄県 ]; } /** * 郵便番号から県番号への変換を行ないます。 * * 厳密に県を判定する必要がない場合は、第二引数の市町村は不要です。 * * @param string $postal_code 郵便番号 * @param string $address1 市町村 */ public static function convert($postal_code, $address1 = '') { $postal_code = str_replace('-', '', $postal_code); foreach (self::getMap() as $key => $code) { if (preg_match($key, $postal_code)) { if (is_callable($code)) { return $code($address1); } return $code; } } return ''; } } |