PHPのswitch文で条件を複数指定する方法は?

このQ&Aのポイント
  • PHPのswitch文では、通常は1つの条件しか指定できません。
  • ただし、複数の条件を指定したい場合には、caseの横にandやorを使って条件を組み合わせることができます。
  • 例えば、東京・田中さんのように複数の条件で値を返したい場合には、'case "東京・田中さん" and "ペットはいぬ"'のように条件を書くことができます。
回答を見る
  • ベストアンサー

<PHP>2つの条件を満たす switch 

下記のようなソースの場合は条件が一つしか指定できません。田中さんとかの苗字だけではなく、例えば、東京・田中さんであれば”ペットはいぬ”と言った感じ値を返したいのですが・・・ caseの横にandなどを使えば言いのかなとは思ったのですが、HP等が見つかりません。初歩的な質問だとは思いますが、ご指導をお願いします。 --------------------- <?php $type = "田中さん"; switch ( $type ) { case "鈴木さん": echo 'ペットはいぬ'; break; case "佐藤さん": echo 'ペットはきじ'; break; case "田中さん": echo 'ペットはさる'; break; } ?>

  • PHP
  • 回答数6
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.6

こうじゃない? <?php $member1=array("member"=>"田中さん","pref"=>"東京"); check_pet($member1); $member2=array("member"=>"田中さん","pref"=>"大阪"); check_pet($member2); $member3=array("member"=>"田中さん","pref"=>"名古屋"); check_pet($member3); function check_pet($memberinfo){ switch($memberinfo){ case array("member"=>"田中さん","pref"=>"東京"): echo 'ペットはいぬ'; break; case array("member"=>"田中さん","pref"=>"大阪"): echo 'ペットはさる'; break; default: echo 'ペットはいません'; break; } } ?>

origin_five
質問者

お礼

まさに理想系です。

その他の回答 (5)

回答No.5

多次元連想配列を使用した表引きを使用できませんか? $都道府県 = "東京" や "大阪" が入ります $名前 = "田中" や "鈴木" が入ります。 // 表引きのためにテーブルを作成します。 //$messageTable[都道府県][名前] = メッセージ $messageTable["東京"]["田中"] = "ぺっとはいぬ"; $messageTable["東京"]["鈴木"] = "ぺっとはねこ"; $messageTable["大阪"]["田中"] = "ぺっとはらいおん"; $messageTable["大阪"]["鈴木"] = "ぺっとはきりん"; // 表引き echo $messageTable[$都道府県][$名前] http://nyx.pu1.net/reference/typearray/multi.html

origin_five
質問者

お礼

そこまでの勉強が出来ていませんでした・・

  • 1minn
  • ベストアンサー率57% (52/90)
回答No.4

1&2です。 hogehoge78の書き方がまさにそれですね。 ただそれだとswitch文がほぼ無意味です。 ソースとしてその方が見やすいのであればそれもありかもしれませんが・・・ 普通にif文で 「&&」 AND条件にすれば良いだけだと思います。

origin_five
質問者

お礼

僕もそう思いました・・・ でも、switch文が浮かんでしまいまして。勉強不足です。

回答No.3

<?php switch(true){ case $type=="田中さん" && $pref=="東京": echo 'ペットはいぬ';break; case $type=="田中さん" && $pref=="大阪": echo 'ペットはさる';break; } ?> こういうことでしょうか? switchに、boolean(true/false)を渡してやって、case文の条件に、booleanが返るような条件を与えてやればヒットします。

origin_five
質問者

お礼

ありがとうございます!自分が考えてたやり方です。

  • 1minn
  • ベストアンサー率57% (52/90)
回答No.2

補足について その程度であればそのままcase文を追加したほうが早いですよね。 もしそれが10や100あるんだとしたらループで条件がヒットしたらループから抜けるような書き方でよいのではないでしょうか? そのほかヒットさせるには、配列の便利な関数などもいくらでもありますし、正規表現を使って見つけるのもありだと思います。 DBから必要なデータだけを取得するSQLを書くこともあると思います。 東京・田中 = 犬 東京・佐藤 = 猫 などのデータが見た目で判別できないほど件数があるのであれば、「人」に対応した「ペット」のデータが必要になりますよね。 テキストファイルでもDBでもよいと思いますが、そこからデータを取得して該当するデータを見つけてあげる処理になると思いますが、具体的な情報がないのでこれ以上具体的な回答は難しいです・・・ 回答になっていないですね。すみません。

origin_five
質問者

お礼

何度もありがとうございます。 case "変数1の値" and "変数2の値"(case "田中さん" and "東京") echo ペットは犬 といった書き方があるかと思いまして。

  • 1minn
  • ベストアンサー率57% (52/90)
回答No.1

$type = "田中さん"; switch ( $type ) { case "鈴木さん": echo 'ペットはいぬ'; break; case "佐藤さん": echo 'ペットはきじ'; break; case "田中さん": echo 'ペットはさる'; break; case "東京・田中さん": echo 'ペットはいぬ'; break; } こーゆーことでしょうか?

origin_five
質問者

お礼

説明が悪くてすみません。 変数を2つ使い、その組み合わせで値を返すと言うことです。 田中さんでも、 東京の田中さん、大阪の田中さん、名古屋の田中さんで値を返したいと言うことです。上記のソースでもその分、caseを増やせばいいのでしょうが・・・ もっとシンプルな方法があるかと。

関連するQ&A

  • PHPについて質問です。(switch文)

    PHPについて質問です。(switch文) 前のフォームのテキストフィールドから受け取った"fn"の値を使ってswhitch文で判定したいです。 <?php $a = $_POST['fn']; switch( $a ){ //←ここが予期せぬエラーとでました。 case 1: echo '$aは1です。'; break; case 2: echo '$aは2です。'; break; case 3: echo '$aは3です。'; break; default: echo '$aは1・2・3のいずれでもありません。'; } ?> どこらへんがいけないのですか?

    • ベストアンサー
    • PHP
  • php修正について

    phpで下記のように書いていますが $value = $row_DetailRS1['shop']; switch ($value) { case "01": echo "愛宕店"; break; case "02": echo "伊形店"; break; case "03": echo "出北店"; break; case "04": echo "惣領店"; break; case "05": echo "東郷店"; break; case "06": echo "東出北店"; break; case "07": echo "無鹿店"; break; case "08": echo "柳沢店"; break; default: echo "未設定"; break; } "09"で"細島店"を追加したいのですがどこを追加修正すれば良いでしょうか? 教えてください。

    • ベストアンサー
    • PHP
  • PHPで画像を表示するプログラムについて

    実行するとランダムで取得した値を利用して、3パターンくらいの画像を切り替えて表示するPHPファイル を作成したいです! 以下のように書いてみたのですが、如何せん初心者なものでできない原因すらわかりません! 間違っているところを是非指摘していただきたいです。 宜しくお願い致します <?php $rand = rand(1,10); switch($rand){ case 1: echo("1"); break; case 2: echo("2"); break; case 3: echo("3"); break; case 4: echo("4"); break; case 5: echo("5"); break; case 6: echo("6"); break; case 7: echo("7"); break; case 8: echo("8"); break; case 9: echo("9"); break; case 10: echo("10"); break; if ($rand <= 3){ echo"<img src='a.jpg'>"; } elseif ($rand 4< || $rand >6 ) { echo"<img src='b.jpg'>"; elseif ($rand 7< || $rand >10 ) { echo"<img src='c.jpg'>"; } } ?>

    • 締切済み
    • PHP
  • PHPの勉強してちょっとした質問

    初歩的な質問なんです。 PHPで別ページを作ってみたいと思ったのですが、 どうしたらいいかと質問をしてみました。 <?php switch($_POST["mode"]){ case "test_b": break; default: test_a(); } function test_a(){ echo "test_a"; echo "<a href="index.php?mode=test">test_b</a>"; } function test_b(){ echo "test_b"; echo "<a href="index.php?mode=test">test_a</a>" } ?>

    • 締切済み
    • PHP
  • phpのswitchについて教えて下さい brea

    phpのswitchについて教えて下さい breakがないとなぜその後のechoを全て表示してしまうんでしょうか? 条件には合致していないはずですよね? $weeks = "Tue"; switch($weeks){ case"tue": echo"火曜日"; case"wed": echo"水曜日"; この後同じ物を全て表示しますよね? 火曜日水曜日木曜日金曜日土曜日 実際はcaseに該当していないじゃないですか?

    • ベストアンサー
    • PHP
  • phpのswitch文

    お世話になります。下記のようなフォームがあります。 <form method="post"><input type="submit" value="新規登録" name="registration"><form method="post"><input type="submit" value="一覧" name="list"></form> 新規登録と一覧、2つのボタンがあるのですが押されたボタンによって処理を区別したいです。 データを受け取るPHP内に下記のように記述したのですが思い通りの結果になりません。アドバイスを宜しくお願いします。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー <?php switch(ココの記述が判りません){ //新規登録画面を表示 case "registration": print "新規登録!"; break; //一覧を表示 case "'list', )": print "一覧表示"; break; default: print "ココがデフォルト表示"; } ?> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー if文だとif(isset($_POST["registration"])){の記述で分岐できたのですが、条件分岐が多いのでswitch文で書きたいです。 宜しくお願いします

    • ベストアンサー
    • PHP
  • PHPのswitch文について

    こんにちは。 switch文を使って、 hogehoge.php?mode=admin や、 hogehoge.php?mode=admin&setting1 などのように、 hogehoge.phpの後に?○○=□□&△△のような好きな文字を入れたいのです。 あるPHPスクリプトを参考に、下のようにしてみたのですが、まったく動作しません。 switch ($_GET['mode']) { case "admin" : $inc_file = "./admin/"; break; } また、?mode=admin&setting1のように&を付ける方法がわかりません。 上のようにする場合は、どうすればよいでしょうか? よろしくおねがいします。 また、分からない部分があったら、補足要求お願いします。

    • ベストアンサー
    • PHP
  • phpのswitch文で必ずdefault処理さる

    phpでswitch文を使って変数の値に応じて処理を変えたいのですが、なぜか常にdefault処理をされてしまいます。 htmlの別ファイルから例えば"テスト,テスト2,テスト3"という文字列を受け取って strtok()を使って、$aに"テスト", $bに"テスト2", $cに"テスト3"と入るようにしました。 それで$aには"テスト"の文字列が入っているはずなので、 switch($a){ case "テスト":~~/処理 break; default:~~//処理 break; } と書いた場合、case "テスト" の処理がされるはずだと思うのですが、 なぜかdefaultの場合の処理がされてしまいます。 gettype($a); で$aの型を調べると、string型になっていおり、 $aの中身を echo "a: {$a}"; で確認すると 「a: テスト」と表示されます。 しかし、if文で if($a == "テスト"){ echo "a match テスト"; } else{ echo "not match"; } のように書いてみると、 「not match」が表示されます。 この理由が分かりません。  この理由が分かる方はいらっしゃいますか? 解決策を教えてください。 また、もしかしたら$aにはecho や print()では表示されない文字が 付属しているのかもしれないと考えていますが、 echoやprint()で表示されない文字を表示させる方法はありますか?

    • ベストアンサー
    • PHP
  • php の処理をした結果をカウントアップさせたい

    php と mysqlで作ろうと考えてます。 ・内容 php の処理をした結果 同じ名前があった場合 その名前をカウントアップさせたいです。 DBのテーブル name|counter 田中|1 佐藤|2 鈴木|5 phpの処理をした結果 「田中」 が重複していたい場合のDBの結果内容 name|counter 田中|2 佐藤|2 鈴木|5 参考サイトがございましたらアドバイスいただければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • switch文の中でforeach

    switch文の中でforeachをしたいのですが、うまくいきません。 <現状> $x=5; switch( $x ){  case 2:   echo $x="JavaScript";    break;  case 5:   echo $x="PHP";   break;  default:   echo $x="未分類"; } <やりたいこと>判定データを別で用意して、読み込ませたい $x_master = array(  2 => "JavaScript",  5 => "PHP", ); ■テスト1 $x=5; switch( $x ){  foreach( $x_master as $key => $value ){   case $key:    echo $x=$value;   break;  }   default:    echo $x="未分類"; } これを試すと、Parse error: syntax error, unexpected T_FOREACH, expecting T_CASE or T_DEFAULT or '}'となります。これは、switchの中でforeachは使えないということでしょうか? ■テスト2 $x=5; foreach( $x_master as $key => $value ){  switch( $x ){   case $key:    echo $x=$value;    break;   default:    echo $x="未分類";  } } $x=2;だとJavaScript未分類となるのに、$x=5;だと未分類未分類になります。 $x=2と$x=5で挙動が異なる理由が分かりません。 ■テスト3 $x=5; foreach( $x_master as $key => $value ){  switch( $x ){   case $key:    echo $x=$value;   break;  } } これでようやく望んだ結果が得られたのですが、これでo.k.のなのでしょうか? なんでdefault入れてはダメなのでしょうか? foreachでいくら回しても、該当部分が存在する限り、breakして、defaultへはいかないと思うのですが…。それともforeachの一番最後の終了処理で何かが返ってきて、それが該当項目に存在せず、defaultへ流れる結果となるのでしょうか? そもそも、考え方として、foreachで回している以上、この場合、例外というか、switch文のdefaultに該当する部分は必要ないとの認識でよいでしょうか? 質問内容 ■テスト1が、syntax errorとなる理由 ■テスト2で、$x=2なら$x_masterを読み込むのに、$x=5なら$x_masterを読み込まない理由 ■テスト3のケースは、default部分を本当に書かなくてo.k.でしょうか? またその理由は?

    • ベストアンサー
    • PHP

専門家に質問してみよう