• ベストアンサー

phpでこのswitch構文おかしくないですか?

phpでこのswitch構文おかしくないですか? https://www.flatflag.nir87.com/switch-622 59と60を変数に入れても出力できないですよねこれだと?

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5139/13417)
回答No.2

59 と 60 は判定外なので出力できませんね。 因みに 18 も出力されませんね。 コメント通りに出力したいのであれば switch ($age) {  // 年齢が18歳未満だったら…  case $age < 18;   echo '18歳未満';   break;  // 年齢が18歳〜59歳だったら…  case $age > 17 && $age < 60;   echo '18~59歳';   break;  // 年齢が60歳以上だったら…  case $age > 59;   echo '60歳以上';   break; } と書くのが正解でしょうね。

okwaveokw
質問者

お礼

ありがとうございます 18歳もですね すごくわかりやすいし納得できたのですっきりしました

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • dell_OK
  • ベストアンサー率13% (746/5661)
回答No.5

回答No.3です。 くうう、むずかしすぎましたか、私の落ち度ですみません。 「59と60を変数に入れても出力できない」事とは無関係なので、回答ではなくなりますが、今一度チャンスをください。 caseに画像のような式を書くと、それぞれが評価されるとtrueかfalseになります。 その値とswitchの括弧内の値が等しいかどうかで分岐されます。 なので以下のように書くべきだと言いました。 $age = 41; switch (true) {//$ageを書かない case $age < 18://「41 < 18」なのでfalse echo '18歳未満'; break; case $age > 18 && $age < 59://「41 > 18 かつ 41 < 59」なのでtrue echo '19~59歳'; break; case $age > 60://「41 > 60」なのでfalse echo '60歳以上'; break; } そしてswitchの括弧内に$ageを書いてはいけないことも付け加えました。 なぜならcaseの評価値の型に合わせて、switchの括弧内の値が等しいかどうかで分岐されるからです。(これは私の憶測なのでPHPの仕様とは異なるかも知れません) caseの評価値はtrueかfalseなので、$ageが0の場合は$ageがfalseとみなされてしまいます。 $age = 0; switch ($age) {//0なのでfalseとみなされる case $age < 18://「0 < 18」なのでtrue echo '18歳未満'; break; case $age > 18 && $age < 59://「0 > 18 かつ 0 < 59」なのでfalse echo '19~59歳'; break; case $age > 60://「0 > 60」なのでfalse echo '60歳以上'; break; } 結果『「0 > 18 かつ 0 < 59」なのでfalse』と『0なのでfalseとみなされる』でどちらもfalseで等しいので、ここへ分岐されてしまいます。 「break;」があるので最初に見つかったここだけで、次の「false」は無視されます。 期待としては、0歳は'18歳未満'であって欲しいはずなのに、そうなりません。 少しはわかりやすくなりましたでしょうか。

okwaveokw
質問者

お礼

私の質問は、 59と60を変数に入れても出力できないですよねこれだと? これだけなので、

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (746/5661)
回答No.4

回答No.3です。 興奮して読み返すのを怠りましたので訂正します。 「浅井署」は「最初」に読みかえてください。

okwaveokw
質問者

お礼

ありがとうございます

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (746/5661)
回答No.3

おかしいです。 いろいろとおかしいです。 それに、投稿者は勘違いされていると思います。 見てわかる簡単なことは割愛しますが、私が重視する点だけ説明させていただくと、caseに式を書く場合は、switchの括弧内はtrueを書くべきです。でなければせめてfalseです。 投稿者自身も書かれていますが「ダブって使っているので冗長なコードになっている」と言うのはswitch括弧内の「$age」のことだと思います。 これはゼロ以外の場合は暗にtrueであり、ゼロの場合は暗にfalseとなります。switch(true)やswitch(false)と書いたのと同じと言うことです。 そのうえで、caseの「$age < 18」や「$age > 18 && $age < 59」や「$age > 60」がそれぞれtrueかfalseか評価され、switchの括弧内と等しいか否かが判定されるものです。 $age=41ならswitch括弧内はtrueなので、caseのうち最初に見つかったtrueの条件に分岐します。 それを、投稿者は、switchに「$age」を書いて、さらにcaseにも「$age」を書くのが書き方だと思っているようです。 $age=0で試すとわかりますが、これはfalseになるので、「$age < 18」がtrueのためここは処理されず、次の「$age > 18 && $age < 59」が浅井署に見つかったfalseのためここが処理されます。 switchはあくまで、括弧内の値とcaseの値が等しいかどうかを見ているのであって、大なり小なりを見ているわけではありません。

okwaveokw
質問者

お礼

ありがとうございます むずかしすぎてさっぱりわかりません

全文を見る
すると、全ての回答が全文表示されます。
  • GENESIS
  • ベストアンサー率42% (1125/2630)
回答No.1

もしかすると13行目の59を60にする必要があるのかなと思います。 そうすれば60歳以下なので59歳は引っかかるのでは。 ただそうなると60歳は何処へ行った?ってな事に。 60歳は60歳以上に含まれるので>=にするべかなと。 まあ、あくまでもサンプルなので…。

okwaveokw
質問者

お礼

このページの作者の人がまちがっていますよね

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Switch構文について

    最初にbreakが登場するまでブロック内の処理を実行するということを理解しました。 特定のcaseでのみbreakさせるような場合に、switch構文を使ってみたいです。 サンプルプログラムを作ってみて、構文の理解を深めているのですが 「特定のcaseでのみbreakさせる」例が思いつきません。 実際どのような場合にこの構文を使いたくなりますでしょうか。 (caseのたびに、必ずbreakさせるのであれば、if構文を使いたくなる) 想定しているイメージは ある条件がととのった場合は下記の処理を実行する。  処理(1)→処理(2)→処理(3)→処理(4) 別の条件がととのった場合は下記の処理を実行する。  処理(2)→処理(3)→処理(4) ※OKWAVEより補足:「Webシステム開発」についての質問です。

  • PHPのシンプルな構文(初心者)

    ランダムに出る掛け算の答えを入力して 別ファイルで正解か不正解という表示をする構文なのですが 「input type="hidden"」部分の値の出力・受取りができず 正しく実行がされません。 どこが間違っているのでしょうか? よろしくお願いいたします。 in.php -------------------------------------- <?php $saki = rand(1,9); $ato = rand(1,9); echo "$saki X $ato"; $seikai = $saki*$ato; ?> <html> <body> <form method="post" action="out.php"> <input type="text" name="kotae"> <input type="hidden" name="hid" value="<?php $seikai ?>"> ←※ <input type="submit" value="回答"> </form> </body> </html> -------------------------------------- out.php -------------------------------------- <?php $kotae = $_POST["kotae"]; $seikai = $_POST["hid"];     ←※ if($kotae == $seikai){ echo "正解です"; }else{ echo "間違っています。"; } echo "<hr>正解は{$seikai}です。"; ?> --------------------------------------

    • ベストアンサー
    • PHP
  • phpのSwitch文のswitchってそもそもど

    phpのSwitch文のswitchってそもそもどういう意味なんでしょうか? ifはわかります もしもこういう場合は というので switchってなんですか?電源を押すみたいな意味ですか?

    • ベストアンサー
    • PHP
  • html構文をPHPの変数に正しく格納できない

    最近PHPを勉強していまして、変数の格納について、質問させていただきます。 <a href="aaa.index" onclick="window.open('bbb.php?id=ccc&adwares=ddd&url='); return false; rel='nofollow'"><img src="eee.jpg"></a> これは、とあるアフィリエイトプログラムの広告で、リンク先のページにリンクする時に、自分のidを送るというような構文(?)なのですが、 上の様な画像付リンク(アフィリエイトコード)をphpの変数に格納する場合、 <? php $url ='<a href="aaa.index" onclick="window.open(\'bbb.php?id=ccc&adwares=ddd&url=\'); return false; rel=\'nofollow\'"><img src="eee.jpg"></a>'; ?> として、 <?php echo $url ?> としましたが、新しいウインドウが出ずに、自分のサイトからのアクセスとして、 カウントされていませんでした。 どうすれば新しいウィンドウがでて、自分のサイトからのアクセスとして 認証されるでしょうか? それともそういう事は無理なのか?教えてください。

    • ベストアンサー
    • 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文について switchはif

    phpのswitch文について switchはifと違って、条件式の中がブール型の論理演算とかではないんですか? 完全に1つの値とかなんですかね? $num1>5とかそういうのは入らないんですか?

    • ベストアンサー
    • PHP
  • phpのifとswitchって似てますけど if

    phpのifとswitchって似てますけど ifはカッコの中に大なり小なりをいれますが switchは入れませんよね 似てるけどこういう所が違うんですかね? <?php if ($a > $b) { echo "aはbより大きい"; $b = $a; } ?>

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

    phpのswitch文のcaseで switch ( $a ) case "1", "2", "a": のように、カンマで並べる事はできないのでしょうか?

    • ベストアンサー
    • PHP
  • PHPでは -lで構文チェックを行うとヘルプに書いていますが、

    PHPでは -lで構文チェックを行うとヘルプに書いていますが、 なぜか require_once()文以降は、ノーチェックのような気がします。 結局実行させてエラーがあるか見つけています。 perlでは -wオプションでできる(確証はないのですが)のに、phpでは仕方ないのでしょうか? そもそもスクリプト言語は、実行されるまでエラーがわからない?でしょうか。 構文エラーだけでも実行する前に素早く見つけたいです。

    • 締切済み
    • PHP
  • PHPの構文

    名前と年齢をフォームページから入力して 名前・年齢、そして成人・未成年の表示をするPHPのサンプルがあります。 初学者で無駄な部分が多く複雑になってしまったのですが ここをもっとこうしたほうが良いなど もっとシンプルで分かりやすい構文にできるのでしょうか? よろしくお願いいたします。 in.php ----------------------------------------------- <html> <body> <form action="out.php" method="post"> <table><tr><td>名前入力: <input type="text" name="name"></td></tr> <tr><td>年齢入力: <input type="text" name="age"></td></tr> </table> <input type="submit" value="ボタン"> </form> </body> </html> ----------------------------------------------- out.php ----------------------------------------------- <html> <body> <?php $name = htmlspecialchars($_POST["name"], ENT_QUOTES); $agen = mb_convert_kana($_POST["age"], "a"); $age = htmlspecialchars($agen, ENT_QUOTES); If($name == ""){ if($age == ""){ echo "名前、年齢の入力がありません。"; }else{ echo "名前を入力してください。"; } }else{ if($age == ""){ echo "年齢を入力してください。"; }else{ echo "あなたの名前は{$name}、年齢は{$age}です。"; if($age<20){ echo "あなたは未成年です。"; }else{ echo "あなたは成人です。"; } } } echo "<p><a href='in.php'>フォームに戻る</a>"; ?> </body> </html> -----------------------------------------------

    • ベストアンサー
    • PHP
EP-50v スマートフォンとの接続
このQ&Aのポイント
  • EP-50vのスマートフォンとの接続で、接続機器数が0と表示される問題について解説します。
  • EP-50vのスマートフォンとの接続時に、接続機器数が0と表示される問題についての対処方法をご紹介します。
  • EP-50vのスマートフォンとの接続で、接続機器数が0と表示される場合の対策について説明します。
回答を見る