
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイルでpingの結果を...
-
Dosブロンプトでtabを出力したい
-
switch()文で値の大小比較
-
shシェルスクリプト 空白行の...
-
phpで、可変項目のcsvデータ...
-
DBのハッシュ化したパスワード...
-
batファイルでPC名称の変更
-
syntax error, unexpected 'ech...
-
浮動小数点は 0 含まれますか
-
findstrのerrorlevel
-
コマンドプロンプトのスクリプ...
-
WindowsのイベントログをExcel...
-
php mysql SELECT文でテーブル...
-
コマンドプロンプト フォルダ内...
-
ゼロとNULLを区別して number_f...
-
echoの区切り方(コンマ又はピ...
-
csvの特定のキーワードを指定し...
-
【PHP】define() て便利なよう...
-
小数点以下0の非表示
-
ウイルスもどき
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
ゼロとNULLを区別して number_f...
-
findstrのerrorlevel
-
小数点以下0の非表示
-
switch()文で値の大小比較
-
syntax error, unexpected 'ech...
-
phpでcookieがうまく保存されない
-
Windowsのsetコマンドでの小数...
-
バッチファイルで、全てのウィ...
-
bashの関数の引数にスペースが...
-
DBのハッシュ化したパスワード...
-
コマンドプロンプト フォルダ内...
-
ウイルスもどき
-
pdftkを使った処理をバッチファ...
-
オブジェクトの中身の判定(PHP)
-
PHPでのパスワード制限のセキュ...
-
XMLのタグの有無をPHPで判定し...
-
batファイルでPC名称の変更
おすすめ情報