PHPで郵便番号から都道府県を判定する

PHPで郵便番号から都道府県を判定する必要があり、調べたところ、以下のページを見付けた。

郵便番号は、上2桁で都道府県が決まらない。それどころか、7桁が同じでも都道府県が決まらないものもあるという、不思議な定義になっているようです。 KEN_ALL.CSV を調べて、郵便番号と住所(市区町村)を条件に、都道府県を特定するクラスを作りました。

<?php
echo PostalCodeToPrefectureId::convert('4980000', '桑名郡木曽岬町'); // => 三重
echo PostalCodeToPrefectureId::convert('4980000', '弥富市');         // => 愛知
<?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, // 沖縄県
        ];
    }
 
    /**
     * 郵便番号から県番号への変換を行ないます。
     *
     */
    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 '';
    }
}

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.