都道府県を扱う Perl モジュール Geography::JapanesePrefectures を PHP に移植してみた

<?php
class Geography_JapanesePrefectures
{
    var $_prefectures = array(
        array('id' => 1,  'name' => '北海道',   'region' => '北海道'),
        array('id' => 2,  'name' => '青森県',   'region' =>   '東北'),
        array('id' => 3,  'name' => '岩手県',   'region' =>   '東北'),
        array('id' => 4,  'name' => '宮城県',   'region' =>   '東北'),
        array('id' => 5,  'name' => '秋田県',   'region' =>   '東北'),
        array('id' => 6,  'name' => '山形県',   'region' =>   '東北'),
        array('id' => 7,  'name' => '福島県',   'region' =>   '東北'),
        array('id' => 8,  'name' => '茨城県',   'region' =>   '関東'),
        array('id' => 9,  'name' => '栃木県',   'region' =>   '関東'),
        array('id' => 10, 'name' => '群馬県',   'region' =>   '関東'),
        array('id' => 11, 'name' => '埼玉県',   'region' =>   '関東'),
        array('id' => 12, 'name' => '千葉県',   'region' =>   '関東'),
        array('id' => 13, 'name' => '東京都',   'region' =>   '関東'),
        array('id' => 14, 'name' => '神奈川県', 'region' =>   '関東'),
        array('id' => 15, 'name' => '新潟県',   'region' =>   '信越'),
        array('id' => 16, 'name' => '富山県',   'region' =>   '北陸'),
        array('id' => 17, 'name' => '石川県',   'region' =>   '北陸'),
        array('id' => 18, 'name' => '福井県',   'region' =>   '北陸'),
        array('id' => 19, 'name' => '山梨県',   'region' =>   '関東'), // 信越の場合も
        array('id' => 20, 'name' => '長野県',   'region' =>   '信越'),
        array('id' => 21, 'name' => '岐阜県',   'region' =>   '東海'),
        array('id' => 22, 'name' => '静岡県',   'region' =>   '東海'),
        array('id' => 23, 'name' => '愛知県',   'region' =>   '東海'),
        array('id' => 24, 'name' => '三重県',   'region' =>   '東海'), // 近畿の場合も
        array('id' => 25, 'name' => '滋賀県',   'region' =>   '近畿'),
        array('id' => 26, 'name' => '京都府',   'region' =>   '近畿'),
        array('id' => 27, 'name' => '大阪府',   'region' =>   '近畿'),
        array('id' => 28, 'name' => '兵庫県',   'region' =>   '近畿'),
        array('id' => 29, 'name' => '奈良県',   'region' =>   '近畿'),
        array('id' => 30, 'name' => '和歌山県', 'region' =>   '近畿'),
        array('id' => 31, 'name' => '鳥取県',   'region' =>   '中国'),
        array('id' => 32, 'name' => '島根県',   'region' =>   '中国'),
        array('id' => 33, 'name' => '岡山県',   'region' =>   '中国'),
        array('id' => 34, 'name' => '広島県',   'region' =>   '中国'),
        array('id' => 35, 'name' => '山口県',   'region' =>   '中国'),
        array('id' => 36, 'name' => '徳島県',   'region' =>   '四国'),
        array('id' => 37, 'name' => '香川県',   'region' =>   '四国'),
        array('id' => 38, 'name' => '愛媛県',   'region' =>   '四国'),
        array('id' => 39, 'name' => '高知県',   'region' =>   '四国'),
        array('id' => 40, 'name' => '福岡県',   'region' =>   '九州'),
        array('id' => 41, 'name' => '佐賀県',   'region' =>   '九州'),
        array('id' => 42, 'name' => '長崎県',   'region' =>   '九州'),
        array('id' => 43, 'name' => '熊本県',   'region' =>   '九州'),
        array('id' => 44, 'name' => '大分県',   'region' =>   '九州'),
        array('id' => 45, 'name' => '宮崎県',   'region' =>   '九州'),
        array('id' => 46, 'name' => '鹿児島県', 'region' =>   '九州'),
        array('id' => 47, 'name' => '沖縄県',   'region' =>   '沖縄'),
    );

    function prefectures()
    {
        return array_map(create_function('$p', 'return $p["name"];'), $this->_prefectures);
    }

    function regions()
    {
        return array_merge(array_unique(array_map(create_function('$p', 'return $p["region"];'), $this->_prefectures)));
    }

    function prefectures_in($region)
    {
        $pref = array_filter($this->_prefectures, create_function('$p', "return (\$p['region'] == '$region');"));
        return array_merge(array_map(create_function('$p', 'return $p["name"];'), $pref));
    }

    function prefectures_id($prefecture)
    {
        foreach ($this->_prefectures as $pref) {
            if ($pref['name'] == $prefecture) {
                return $pref['id'];
            }
        }
    }
}
?>


- 使い方

<?php
require_once 'Geography_JapanesePrefectures.php';

$geo = new Geography_JapanesePrefectures;
print_r($geo->prefectures());
// -> array(北海道, 青森県, 岩手県, ..., 鹿児島県, 沖縄県)

print_r($geo->regions());
// -> array(北海道, 東北, 関東, ..., 九州, 沖縄)

print_r($geo->prefectures_in('関東'));
// -> array(茨城県, 栃木県, 群馬県, 埼玉県, 千葉県, 東京都, 神奈川県, 山梨県)

print_r($geo->prefectures_id('東京都'));
// -> 13
?>


  山梨県は関東なのかとか,三重県は東海なのかだとかこの辺りはいろいろあるらしいけど,オリジナルに合わせてあります.
  全体的に create_function() 使いすぎてキモイことになっていまが,あまり気にしないでください.
  特に,prefectures_in() のキモさはどうにかしたいところであります.

- Geography::JapanesePrefectures
  http://search.cpan.org/~tokuhirom/Geography-JapanesePrefectures/lib/Geogra ...

- via: オレンジニュース
  http://secure.ddo.jp/~kaku/tdiary/20060915.html#p09