区名の前に市名を追加した 市町村コードjsonデータを書きだしてみる

[市町村コードの対応データをjsonで書きだしてみる \- Qiita](https://qiita.com/sin164/items/f33bf2d0ec3d43994228)で作った全国地方公共団体コードjsonを使って[都道府県名、区市町村名から市町村コードを吐き出す関数を考えてみたものの \- Qiita](https://qiita.com/sin164/items/5db165f4ad6677cfe6eb)同一都道府県に同一名称の区があるところがあるのので、そのままでは使えなさそう。

しかたがないので全国地方公共団体コードjsonを吐き出す方法を見直してみた。

方針としては区の場合は所属する市名を頭に追加する。
そのために、区で終わる市区町村目を探して、その区が所属する市名を取得
区で終わる市区町村名の頭に、その区が所属する市名を追加
といった手順で良いのかな

[全国地方公共団体コード \- Wikipedia](https://ja.wikipedia.org/wiki/%E5%85%A8%E5%9B%BD%E5%9C%B0%E6%96%B9%E5%85%AC%E5%85%B1%E5%9B%A3%E4%BD%93%E3%82%B3%E3%83%BC%E3%83%89#%E7%89%B9%E5%88%A5%E5%8C%BA%E3%81%AE%E5%8C%BA%E5%9F%9F%E3%81%8A%E3%82%88%E3%81%B3%E6%94%BF%E4%BB%A4%E6%8C%87%E5%AE%9A%E9%83%BD%E5%B8%82)によると

- 特別区の区域（区部全体のこと）および政令指定都市には 100 が、区には 101 からの連番が与えられる
- 都道府県に指定都市が複数ある場合は、これまでは2市の例外を除き 100 と 130 が与えられている
- 都道府県内第3の指定都市として現在唯一である相模原市には、（160 ではなく）150 が与えられた
- 堺市の場合、例外として 140 が割り振られた。

さらに東京23区の場合には頭に市名をつけない、ということで、こんな感じ。

```php:citycode2.php
<?php
$pref_ids= array(
  "01" => "北海道",
  "02" => "青森県",
  "03" => "岩手県",
  "04" => "宮城県",
  "05" => "秋田県",
  "06" => "山形県",
  "07" => "福島県",
  "08" => "茨城県",
  "09" => "栃木県",
  "10" => "群馬県",
  "11" => "埼玉県",
  "12" => "千葉県",
  "13" => "東京都",
  "14" => "神奈川県",
  "15" => "新潟県",
  "16" => "富山県",
  "17" => "石川県",
  "18" => "福井県",
  "19" => "山梨県",
  "20" => "長野県",
  "21" => "岐阜県",
  "22" => "静岡県",
  "23" => "愛知県",
  "24" => "三重県",
  "25" => "滋賀県",
  "26" => "京都府",
  "27" => "大阪府",
  "28" => "兵庫県",
  "29" => "奈良県",
  "30" => "和歌山県",
  "31" => "鳥取県",
  "32" => "島根県",
  "33" => "岡山県",
  "34" => "広島県",
  "35" => "山口県",
  "36" => "徳島県",
  "37" => "香川県",
  "38" => "愛媛県",
  "39" => "高知県",
  "40" => "福岡県",
  "41" => "佐賀県",
  "42" => "長崎県",
  "43" => "熊本県",
  "44" => "大分県",
  "45" => "宮崎県",
  "46" => "鹿児島県",
  "47" => "沖縄県"
);

$city_code = [];
foreach ($pref_ids as $pkey => $pvalue) {
  $req =  'http://www.land.mlit.go.jp/webland/api/CitySearch?area='.$pkey;
  $json = file_get_contents($req);
  $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
  $addcode = json_decode($json, true);

  foreach ($addcode['data'] as $key => $value) {
    if($key <> "13"){
      $ku=preg_grep('/区$/', $value);
      if($ku){
        $sikii = 30;
        if($key === "27"){
          $sikii = 40;
        }
        if(intval(substr($addcode['data'][$key]['id'], -3, 3)) > 150){
          $cityid = substr($addcode['data'][$key]['id'], 0, -2)."50";
        }elseif (intval(substr($addcode['data'][$key]['id'], -3, 3)) > 100 + $sikii) {
          $cityid = substr($addcode['data'][$key]['id'], 0, -2).strval($sikii);
        }else {
          $cityid = substr($addcode['data'][$key]['id'], 0, -2)."00";
        }
      $addcode['data'][$key]['name'] = array_search($cityid,array_column($addcode['data'],'id','name')).$addcode['data'][$key]['name'];
      }
    }
    echo $pvalue.','.$addcode['data'][$key]['id'].','.$addcode['data'][$key]['name'].'<br>' ;
  }
  $city_code += array($pkey =>array("pref-code" => $pkey , "pref-name" => $pvalue ,'data' => $addcode['data']));
}

$arr = json_encode($city_code,  JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
file_put_contents("citycode.json" , $arr);
```

ついでにjsonファイルを書き出すだけでなく、ブラウザにCSV形式で表示するようにしてみました。
まだちゃんと検証してないですが、何か間違えがあったらご指摘ください。