データベースのPre列に都道府県名と間違いデータ(京と、とか)が入っていて、そこから重複無しでリスト化し、一般的な北海道から沖縄までに並べたい場合、少しだけ考える必要があったので、メモ。ただ並べるだけだと、こちらのこちらの思惑通りには並んでくれません。まずは、都道府県リストを作って、それを参照することで解決できました。ブラウザからユーザに都道府県を選んでもらうのが目的だったため今回はPHP。
以下はそのコード。
// 一般的な都道府県の順序
$prefecture_order = array(
"北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県",
"茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県",
"新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県",
"三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県",
"鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県", "香川県", "愛媛県", "高知県",
"福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"
);
// 重複無しのPreを取得
$stmt = $db_google->prepare("SELECT DISTINCT Pre FROM master");
$stmt->execute();
$prefectures = array();
$others = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if (in_array($row['Pre'], $prefecture_order)) {
$prefectures[] = $row['Pre'];
} else {
$others[] = $row['Pre'];
}
}
// 都道府県の順序に合わせてソート
usort($prefectures, function($a, $b) use ($prefecture_order) {
return array_search($a, $prefecture_order) - array_search($b, $prefecture_order);
});
// 都道府県を出力
foreach ($prefectures as $prefecture) {
$selected = ($prefecture === "東京都") ? " selected" : "";
echo '<option value="'.htmlspecialchars($prefecture).'"'.$selected.'>'.htmlspecialchars($prefecture).'</option>';
}
// それ以外を出力
foreach ($others as $other) {
echo '<option value="'.htmlspecialchars($other).'">'.htmlspecialchars($other).'</option>';
}
(関数部分は、省略)
おまけで最初に選ばれるのは東京都で。