質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.04%

PHPのSwitch文をコンパクトにする方法

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 958

dokoniarukana

score 29

前提・実現したいこと

初心者で申し訳ありません。
都道府県すべてのあるデータを取得しているのですが、
コードをご覧のとおり、東北地方のeq()変数は(2,4,5)で、関東が(1,3,4)、
その他の各地方もあり、それも下に続いています。[ex.関西(0,2,3) 四国(3,5,6) 近畿(4,6,7)...]
このまま全て書くと長くなってしまうので行を減らすことはできないでしょうか。

URLも「http://」と「.com/」は一緒なので省略?と
いうのでしょうか、
そういった感じの表記はできるのでしょうか。
間はローマ字で県名が入ります。

よろしくおねがいします。

$switch= '北海道';

    //地域によって異なるため変数とURLを定義
    switch ($switch){
        case '北海道':
          $eq = array(2,4,5); //
          $url = 'http://hokkaidou.com/';
          break;
        case '東京':
          $eq = array(1,3,4);  //
          $url = 'http://toukyou.com/';
          break;
        case '青森':
          $eq = array(2,4,5);
          $url = 'http://aomori.com/';
          break;
        case '千葉':
          $eq = array(1,3,4);
          $url = 'http://chiba.com/';
          break; 
        case '秋田':
          $eq = array(2,4,5);
          $url = 'http://akita.com/';
          break;
        case '埼玉':
          $eq = array(1,3,4);
          $url = 'http://saitama.com/';
          break;      
      }

追記
下記のコードで無事に短くすることができました。
もうひとつ質問なのですが、

$pref_data = array(
  '北海道' => array(2,4,5,'hokkaidou'),
  '東京'   => array(1,3,4,'toukyou'));
$eq  = $pref_data[$switch];
$url = 'http://' . array_pop($eq) . '.com/';


↓このような代入?はできないのでしょうか。

$a = '2,4,5'
$b = '1,3,4'

$pref_data = array(
  '北海道' => array($a,'hokkaidou'),
  '東京'   => array($b,'toukyou'));
$eq  = $pref_data[$switch];
$url = 'http://' . array_pop($eq) . '.com/';
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina_dev

    2016/08/07 17:18

    私の回答をよく見るんだ

    キャンセル

回答 4

+3

$arrPref = array(
    1 => '北海道'
    , 2 => '青森'
);

$arrSetting = array(
    1 => array(
        'eq' => array(2, 4, 5)
        , 'url' => 'http://hokkaidou.com/'
    )
    , 2 => array(
        'eq' => array(2, 4, 5)
        , 'url' => 'http://aomori.com/'
    )
);

$res = $arrSetting[array_search('北海道', $arrPref)];
var_dump($res);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/07 14:12

    これって、キーに日本語使うのは気持ち悪いなあ。ってことですか?

    キャンセル

  • 2016/08/07 14:16 編集

    それもあるけど、都道府県のリストっていろんな場面で利用されるであろうという感じですね。都道府県のセレクトボックスを作りたい場合、丸ごとひとつの配列で定義しちゃうと、使いにくい。
    DBの正規化と同じアプローチです。

    キャンセル

  • 2016/08/07 14:18

    ありがとうございます。理解できました。
    dokoniarukana さん、横から失礼しました。

    キャンセル

checkベストアンサー

+2

大差ないですけど、こんなんとか

$pref_data = array(
  '北海道' => array(2,4,5,'hokkaidou'),
  '東京'   => array(1,3,4,'toukyou'),
  '青森'   => array(2,4,5,'aomori'),
  '千葉'   => array(1,3,4,'chiba'),
  '秋田'   => array(2,4,5,'akita'),
  '埼玉'   => array(1,3,4,'saitama'));
$eq  = $pref_data[$switch];
$url = 'http://' . array_pop($eq) . '.com/';


--- 追加 ---

そういうときは

$a = '2,4,5'
$b = '1,3,4'

$pref_data = array(
  '北海道' => array($a,'hokkaidou'),
  '東京'   => array($b,'toukyou'));
list($s1, $s2) = $pref_data[$switch];
$eq  = explode(',', $s1);
$url = 'http://' . $s2 . '.com/';


もしくは

$a = array(2,4,5);
$b = array(1,3,4);

$pref_data = array(
  '北海道' => array($a,'hokkaidou'),
  '東京'   => array($b,'toukyou'));
list($eq, $str)  = $pref_data[$switch];
$url = 'http://' . $str . '.com/';

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/07 14:39

    げげ。(^_^;

    キャンセル

  • 2016/08/07 16:36 編集

    質問なのですが、以下のような置き換えを
    やってみたらエラーを吐いたので代入は出来ないのでしょうか。

    $a = '2,4,5'
    $b = '1,3,4'

    $pref_data = array(
    '北海道' => array($a,'hokkaidou'),
    '東京' => array($b,'toukyou'),...略

    キャンセル

  • 2016/08/07 17:13

    助かりました。勉強になります。
    ありがとうございました。

    キャンセル

+2

$pref = array(
   "北海道" => array ("url", $eq /* array() */),
   "青森"   => array ("url", $eq /* array() */),
);

list($url, $eq) = $pref[$name];


とかかなぁ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/07 13:46

    キャンセル

  • 2016/08/07 13:48

    $res = $arrSetting[array_search('東海道', $arrPref)];

    $res = $arrSetting[array_search('青森', $arrPref)];

    キャンセル

  • 2016/08/07 13:51

    ないときにちゃんと動作するかの試験w

    キャンセル

  • 2016/08/07 13:52

    ですねw
    失礼しました。

    キャンセル

0

あ、解決してた・・・。

$key = '北海道';
$tdfk = '|北海道/2,4,5/hokkaidou|東京/1,3,4/toukyou|青森/2,4,5/aomori|千葉/1,3,4/chiba|秋田/2,4,5/akita|埼玉/1,3,4/saitama|';
$match_num = preg_match( '/\|('.preg_quote( $key, '/' ).'[^\|]+)/', $tdfk, $match );
var_dump( $match );

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる