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.でしょうか? またその理由は?
No.2ベストアンサー
- 回答日時:
> ■テスト1
switch 文の構造を間違えています。
case は一種の「分岐命令」で、switchで指定した数値に合うcase文に実行の流れが飛ばされます。
それ以外の部分は実行されません。そのため、「switch の直下には case 文が必要」です。
> switch( $x ){
> foreach( $x_master as $key => $value ){
> case $key:
この例では、foreach文を実行するような選択になるcase文がありませんから、エラーになります。
> ■テスト2
「echo $x="JavaScript";」
これが代入文であることを理解されてますでしょうか。
これは「$x="JavaScript"」という代入で変数$xの内容を変えたあとで、
その代入結果である「"JavaScript"」がechoに渡されて、「JavaScript」と表示されます。
一方、このforeachループの処理の流れを展開すると、
---ここから---
$x=5;
$key=2;
$value="JavaScript";
switch( $x ){
case $key:
echo $x=$value;
break;
default:
echo $x="未分類";
}
$key=5;
$value="PHP";
switch( $x ){
case $key:
echo $x=$value;
break;
default:
echo $x="未分類";
}
}
---ここまで---
という処理の流れになります。そのため、そのため、$x=5の場合、foreachの1回目($key=2,$value="JavaScript")の実行で「echo $x="未分類";」が実行されて、結果として「$x="未分類"」になってしまい、
2回目の($key=5,$value="PHP")でも「echo $x="未分類";」が実行されてしまいます。
結果、表示は「未分類未分類」になります。
> ■テスト3
このforeachの処理の流れはほぼテスト2で述べた通りですが、かなり回りくどいです。
単に$xが$x_masterに該当しているかどうかを表示したいだけでしたら、
---ここから---
$x_master = array(
2 => "JavaScript",
5 => "PHP",
);
$x=5;
if (isset($x_master[$x])) {
echo "x=$x_master[$x]";
} else {
echo "x=未分類";
}
---ここまで---
これだけで十分です。
>「switch の直下には case 文が必要」です
はっきりとしたご指摘、ありがとうございます。
>一方、このforeachループの処理の流れを展開すると、
ひとつひとつ処理を追いかけていったら、すごく理解できました。
>このforeachの処理の流れはほぼテスト2で述べた通りですが、かなり回りくどいです。
1さんの回答もそうですが、この質問をしたことで、色々な書き方を覚えることが出来たので、とても勉強になりました。
(質問した時点では、foreach以外、全く頭に思い浮かびませんでしたー。)
No.1
- 回答日時:
switchは構文ですから、構文に合わないものは当然文法エラーでしょう。
もしやるならこんな感じでどうでしょう?
<?
$x=5;
$x_master = array(
2 => "JavaScript",
5 => "PHP"
);
switch( $x ){
case in_array($x,array_keys($x_master)):
echo '$x='.$x_master[$x];
break;
default:
echo '$x=未分類';
break;
}
?>
ちなみにecho $x=・・・・的な書き方はその時点で$xに値が上書きされているので
常識的にありえない書き方です。
この回答への補足
>case in_array($x,array_keys($x_master)):
こんな書き方も出来るんですね。初めて知りました。
>ちなみにecho $x=・・・・的な書き方はその時点で$xに値が上書きされているので、常識的にありえない書き方です。
ご指摘ありがとうございます。上書きしていってるのに、気が付きませんでした。これから気をつけたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
switch()文で値の大小比較
-
shシェルスクリプト 空白行の...
-
バッチファイルでpingの結果を...
-
phpでcookieがうまく保存されない
-
コマンドプロンプト フォルダ内...
-
syntax error, unexpected 'ech...
-
PHPで$_GET[’m’]の意味が分か...
-
php mysql SELECT文でテーブル...
-
データベースから出力したデー...
-
ゼロとNULLを区別して number_f...
-
小数点以下0の非表示
-
findstrのerrorlevel
-
Windowsのsetコマンドでの小数...
-
オブジェクトの中身の判定(PHP)
-
カレンダーの今日の日付をハイ...
-
$_SERVER["REQUEST_METHOD"]に...
-
電話番号 正規表現
-
バッチファイルで、全てのウィ...
-
WindowsのイベントログをExcel...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
shシェルスクリプト 空白行の...
-
バッチファイルでpingの結果を...
-
phpでcookieがうまく保存されない
-
switch()文で値の大小比較
-
findstrのerrorlevel
-
syntax error, unexpected 'ech...
-
バッチファイルで、全てのウィ...
-
ゼロとNULLを区別して number_f...
-
小数点以下0の非表示
-
オブジェクトの中身の判定(PHP)
-
Windowsのsetコマンドでの小数...
-
$_SERVER["REQUEST_METHOD"]に...
-
XMLのタグの有無をPHPで判定し...
-
Parse error というエラーの対...
-
batファイルでPC名称の変更
-
環境変数「%USERPROFILE%」の内...
-
PHPとCSSを使用して九九...
-
hiddenを使っているのに、表が...
-
DBのハッシュ化したパスワード...
おすすめ情報