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

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

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

7974閲覧

PHPのswitch文の条件に「or」や「||」を書く場合について

carl2020

総合スコア9

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2020/07/14 08:21

以下のコードは食べ物の種類について
条件が合ったときに、任意の文言を出力しています。

1. <?php 2. $food = "bread"; 2. 3. switch ($food) { 4. case "egg": 5. echo "朝ごはんは卵です"; 6. break; 7. case "salad": 8. echo "朝ごはんはサラダです"; 9. break; 10. case "steak" or "yakitori": 11. echo "朝ごはんはステーキかもしれないし、焼き鳥かもしれないです"; 12. break; 13. case "bread": 14. echo "朝ごはんはパンです"; 15. break; 16. default: 17. echo "朝ごはんは食べません"; 18. } 19. ?>

2行目の" "内に食べ物の名前を上から入れていき順番にローカルブラウザで見ていくと、4行目~12行目までは正常に出力されます。

しかし、2行目に"bread"と代入した場合は、14行目にある文言は出力されず11行目の文言が出っぱなしになります。

試しに10行目~12行目のコードを消すと他のすべての出力はうまくいく状況です。

そこで質問なのですが、

・ orをつかっている10行目~12行目のコードはそもそも正しい書き方でしょうか?

・ 何が悪さをして13行目以降が正常に出力されないのか教えていただければ幸いです。

y_shinoda👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/14 19:58

解決後ですが、自身の回答に別案追記しています。参考まで。 (一応、別の形でswitch使いました)
guest

回答3

0

ベストアンサー

or は使えません。その変わり case 文を2つ続けて書きます。

php

1<?php 2$food = "bread"; 3 4switch ($food) { 5case "egg": 6 echo "朝ごはんは卵です"; 7 break; 8case "salad": 9 echo "朝ごはんはサラダです"; 10 break; 11case "steak": 12case "yakitori": 13 echo "朝ごはんはステーキかもしれないし、焼き鳥かもしれないです"; 14 break; 15case "bread": 16 echo "朝ごはんはパンです"; 17 break; 18default: 19 echo "朝ごはんは食べません"; 20} 21?>

break の無い case 文は次の case 文が続けて実行されます。

投稿2020/07/14 08:24

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carl2020

2020/07/14 08:30

さっそくのご回答ありがとうございます◎ 念の為の確認なのですが、「or は使えません。」というのはいかなる場合でもswitch文にはorを充てられないということでしょうか? そういうことでしたら、気持ちよく切り替えられるなと思いました。
mattn

2020/07/14 08:35

質問内容が switch 文の条件と書かれていましたので、switch 文の case の中には書けないという意味で「or は使えません」と書きました。 "foo" or "bar" は PHP では文字列が真偽値として評価され、1 という値になります。例えば "123" or "234" も 1 です。また "0" or "0" は 0 になります。たしかに真偽値を使って無理やり switch/case を書く事も可能ですが、これは本来 質問者さんが期待していない物のはずです。
m.ts10806

2020/07/14 08:50

私見ですが、caseを重ねるときって「AもBもCも同じ処理を行う」ときに使うイメージです。 りんご、バナナ、みかん→果物です みたいな。 「AかもしれないBかもしれない」のような内容を出すと「どちらでもない可能性」がでてきます。
carl2020

2020/07/14 08:53

お二人ともいろいろと汲んだご回答をくださりありがとうございました! 引き続きよろしくお願いいたしますm(_ _)m
guest

0

「かもしれない」などあいまいな表現で出したいなら素直にif文にorを書きましょう。
switchを使う場面ではないと思います。
私は少なくとも定数的にかっちり決まったものを出すためにswitchを使います。

別案

かえって遠回りになった気もするけど、ロジック組まなくても増減可能という点で、参考まで。

php

1<?php 2define("EQQ","eq"); 3define("ORR","or"); 4$msg = [ 5 EQQ=>'%sです' 6 ,ORR=>'%sかもしれない' 7 ]; 8$list = [ 9 'bread'=>['name'=>'パン','conf'=>EQQ] 10 ,'salad'=>['name'=>'サラダ','conf'=>EQQ] 11 ,'steak'=>['name'=>'ステーキ','conf'=>ORR] 12 ,'yakitori'=>['name'=>'やきとり','conf'=>ORR] 13 ]; 14 15$word = 'steak'; 16 17if(array_key_exists($word,$list)){ 18 $w = $list[$word]; 19 echo '朝ごはんは'; 20 switch($w['conf']){ 21 case EQQ: 22 echo sprintf($msg[$w['conf']],$w['name']); 23 break; 24 case ORR: 25 $words = []; 26 foreach($list as $cd=>$row){ 27 if($row['conf']===ORR){ 28 $words[] = sprintf($msg[ORR],$row['name']); 29 } 30 } 31 echo implode('し、',$words).'です'; 32 break; 33 34 } 35} 36 37

投稿2020/07/14 08:26

編集2020/07/14 09:49
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/07/14 08:36

PHPやJavaScriptは別として、caseには定数値しか書けない言語も多いですしね。
m.ts10806

2020/07/14 08:41

要件次第ですが、対象のデータが増えたり、複雑な比較を書くとなったらswitchだと苦しくなるので、決まってる値ではないなら、switch採用を見送った方が良いと思います。
guest

0

本当ですね・・

実際に検証してみたところ、
"steak" or "yakitori"steak
("steak" or "yakitori")1 となります:

console

1$ php test.php 2"steak" or "yakitori" 3steak 4("steak" or "yakitori") 51

しかし、
case 1:case "steak": の場合はブロックを通らない (想定通り) にも関わらず、
case "steak" or "yakitori": の場合はブロックを通ってしまうので、
「switch 文で or を書くことは想定していない振る舞いになってしまう (サポートされていない?)」
ように見えます:

php

1<?php 2 $food = "bread"; 3 4 switch ($food) { 5 case "egg": 6 echo "朝ごはんは卵です"; 7 break; 8 case "salad": 9 echo "朝ごはんはサラダです"; 10 break; 11 case "steak": 12 echo "朝ごはんはステーキです"; 13 break; 14 case 1: 15 echo "朝ごはんは1です"; 16 break; 17 case "steak" or "yakitori": 18 echo "朝ごはんはステーキかもしれないし、焼き鳥かもしれないです"; 19 break; 20 case "bread": 21 echo "朝ごはんはパンです"; 22 break; 23 default: 24 echo "朝ごはんは食べません"; 25 } 26?>

実行結果:

console

1$ php test.php 2朝ごはんはステーキかもしれないし、焼き鳥かもしれないです

投稿2020/07/14 09:05

y_shinoda

総合スコア3272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/07/14 11:54

> "steak" or "yakitori" は steak は、間違いですね。true です。 もしかして、$a = "steak" or "yakitori"; とか書いたんでしょうけど、 これは ($a = "steak") or "yakitori"; で、代入と or "yakitori" は無関係です。
y_shinoda

2020/07/14 12:02

検証のコード貼り忘れましたが、検証したコードはそのとおりです、 計算順序は代入の方が優先されるんですね、勉強になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問