• ベストアンサー

phpのswitchについて教えて下さい brea

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

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

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6638/9405)
回答No.1

「名前:」っていう書式は、思い返してみれば、「ラベル」。 そしてswitch文というのは実は、「該当するラベル内『のみ』を実行する」という命令ではない。 よく if ~ elseif ~ elseif ~ else; の代わりに使えると説明されるが、動作に違いがある。 switchというのは、gotoのように、「該当するラベルに飛び、それ以下を実行する」という命令なのではないか。 なので、break; があることにより、{ } でくくられているswitchブロックを抜けることができる。 逆に break; が無いと、ブロックの残りの部分を実行してしまうのも仕様。 …私はそんな風に考えました。

g5mokdra
質問者

お礼

ありがとうございます

その他の回答 (2)

  • dell_OK
  • ベストアンサー率13% (740/5645)
回答No.3

このコードを実行した結果が表示されると思います。

g5mokdra
質問者

お礼

ありがとうございます

  • dell_OK
  • ベストアンサー率13% (740/5645)
回答No.2

ドキュメントに「PHPはswitchブロックの終わりまたは最初の break文まで実行を続けます。 CASE文の終わりにbreak文を書かない場合は、PHPは 次のCASE文を実行しつづけます。」と書かれているので言語の仕様だと思われます。 例えば、このように複数の値のいずれかと一致するかを判定する場合は連続してcaseを記述できます。 $weeks = 'Mon'; switch ($weeks) { case 'Mon': case 'Tue': case 'Wed': case 'Thu': case 'Fri': echo '平日'; break; case 'Sun': case 'Sat': echo '休日'; break; } caseごとにbreakが必要ではなくするための記述法だと思います。

g5mokdra
質問者

お礼

ありがとうございます お示し頂いたコードでは実際に何の結果が表示されるんでしょうか?

関連するQ&A

  • break後も変数を維持するには、どうすればいいで

    break後も変数を維持するには、どうすればいいでしょうか? switch文とかで、breakした後も、変数へ格納した値を利用するには、どうすればいいのでしょうか? switch($hoge) {  case 0:   $a=24;   break;  case 1:   echo $a;//ここで、24と表示させたい   break; static変数とかを使うのでしょうか?

    • ベストアンサー
    • PHP
  • Excelでの日付表示について

    Excelで日付表示するには、[分類] ボックスの [ユーザー定義] をクリックし、[種類] ボックスに「dddd」または「ddd」と入力。 "dddd" の場合は曜日が完全表記 (Monday、Tuesday、など) で表示され、"ddd" の場合は曜日が略語 (Mon、Tue、Wed、など) で表示される。というのはわかるのですが、月曜日、火曜日、水曜日・・・または、月、火、水・・・のように表示させることは可能でしょうか。 また、その方法をご教授いただけないでしょうか。

  • 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
  • Excel 複数条件集計

    B列   X列   Y列    Z列   AA列  AB列    列 男性       火曜日  水曜日  木曜日        1 女性  月曜日  火曜日  水曜日  木曜日  金曜日    男性          男性  月曜日  火曜日  水曜日  木曜日        1 女性            水曜日  木曜日          ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー C列     X列    Y列   Z列   AA列   AB列   列 19~22才       火曜日  水曜日  木曜日        1 51才以上  月曜日  火曜日  水曜日  木曜日  金曜日    41~50才          19~22才  月曜日  火曜日  水曜日  木曜日        1 31~40才            水曜日  木曜日          ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー アンケート集計の表で男性で「X~AB列のどれかに文字が入っていれば新しい列に1、X~AB列になにも入っていなければ空白としたいです。」女性、年齢、都道府県など「」内を同じことをする項目が100近くあるのでフィルターでは大変です。 下の表は19~22才で「」内こと 複数回答全てなので。AF~BJ、BK~CLなど 作ってみましたが2つを合わせることができませんでした。 =IF(COUNTIF(B6:B6000,B6),1,"") =IF(COUNTA(X6:AB6),1,"") ピボット関数マクロ何でもいいので簡単な方法があれば教えてください。

  • 曜日毎に読み込むphpを変更したい

    はじめまして 曜日毎に読み込むphpを変更したいですが何もわかりません 調べたらジャバではあったんですがスタイルシートがううまく反映しませんでした で、phpをインクルード方法を調べてみましたが曜日の条件分岐までは行けたんですがよくわかりません よろしくお願いします 月曜日(mon.phpを読み込んで表示) 火曜日(tue.phpを読み込んで表示) ・ ・ ・ 日曜日(sun.phpを読み込んで表示) もしくはweek.phpの中に 月曜・火曜・・・・日曜 の表示できるhtmlをかければいいです よろしくおねがいします

    • 締切済み
    • PHP
  • Excel 条件カウント

    前に類似の質問しましたが、 フラグでなくカウントしたいそうです。 B列   X列   Y列    Z列   AA列  AB列     男性       火曜日  水曜日  木曜日         女性  月曜日  火曜日  水曜日  木曜日  金曜日    男性          男性  月曜日  火曜日  水曜日  木曜日         女性            水曜日  木曜日          ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー C列     X列    Y列   Z列   AA列   AB列    19~22才       火曜日  水曜日  木曜日         51才以上  月曜日  火曜日  水曜日  木曜日  金曜日    41~50才          19~22才  月曜日  火曜日  水曜日  木曜日         31~40才            水曜日  木曜日          ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー アンケート集計の表で男性で「X~AB列のどれかに文字が入っていればカウントX~AB列になにも入っていなければカウントしない」この場合だと2です。女性の場合は2です。 女性、年齢、都道府県など「」内を同じことをする項目が100近くあるので フィルターでは大変です。 下の表は19~22才で「X~AB列のどれかに文字が入っていればカウントX~AB列になにも入っていなければカウントしない」これも2になります。 51才以上は1、41~50才は0、31~40才は1です。 複数回答の項目全てなので。AF~BJ、BK~CLなど ピボット関数マクロ何でもいいので簡単な方法があれば教えてください。 宜しくお願いします。

  • 認証ダイアログが表示されない

    はじめまして。 ユーザー名に応じて異なるメッセージを 表示する簡単なプログラムを作っているのですが、 肝心の認証ダイアログが表示されません。 初心者なので簡単なミスだと思いますがよろしくお願いします。 <?php if( $_SERVER[ "PHP_AUTH_USER" ] == "" ){ header( 'WWW-Authenticate: Basic realm="tendays"' ) ; header( 'HTTP/1.0 401 Unauthorized' ) ; echo( "認証失敗" ) ; exit() ; } $hairetu = array( "管理者", "一般ユーザー", "未登録ユーザー" ) ; switch( $_SERVER["PHP_AUTH_USER"] ){ case "admin" : echo( $hairetu[0] . "様、ようこそ!" ) ; break ; case "normal" : echo( $hairetu[1] . "さん、ようこそ!" ) ; break ; default : echo( $hairetu[2] . "さん、ようこそ!" ) ; break ; } ?>

    • ベストアンサー
    • 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
  • 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
  • 音楽について・・・・・・・

    Kinki Kidsの新曲が5月2日に発売されるんです!いつもだと水曜日に発売するはずなのに今回は木曜日なんです!それで水曜日に発売するCDは火曜日に入荷して火曜日に発売してるんです!木曜日の場合はどうなるんですか??

専門家に質問してみよう