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

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

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

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

Q&A

解決済

6回答

1039閲覧

PHPのswitch文の使いどころ

tomoyuki123

総合スコア273

PHP

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

0グッド

0クリップ

投稿2018/11/10 05:51

PHPのswitchは緩やかな比較になるので使うべきではないと思ってるのですが使いどころはありますか?

1、処理が速い 2、可読性が高くなる

メリットとしてこれらを挙げる人がいますが

1についてはそう書いてる記事がたまにありますが、少なくとも以下のコードでは差はありませんでした。(version:7.0.22)

2については条件(1,2,3)が同じ列に並んでるため読みやすいようにも思えます。
(ただ分岐が複数ある時点で可読性がいいとは言えないと思うのですが。)

if文(緩やかな比較)

php

1<?php 2$startTime = microtime(true); 3for($i = 0; $i < 10000; $i++) { 4 if($i == 1) { 5 var_dump(1); 6 } elseif($i == 2) { 7 var_dump(2); 8 } elseif($i == 3) { 9 var_dump(3); 10 } else { 11 var_dump(4); 12 } 13} 14$endTime = microtime(true); 15var_dump($endTime - $startTime);

switch文

php

1<?php 2$startTime = microtime(true); 3for($i = 0; $i < 10000; $i++) { 4 switch ($i) { 5 case 1: 6 var_dump(1); 7 break; 8 case 2: 9 var_dump(2); 10 break; 11 case 3: 12 var_dump(3); 13 break; 14 default: 15 var_dump(4); 16 } 17} 18$endTime = microtime(true); 19var_dump($endTime - $startTime);

他にメリットなどがあれば教えてください。
よろしくお願いします。

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

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

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

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

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

guest

回答6

0

一つの変数を複数の条件であり分ける場合は if より switch かなって思います。
見やすさってより、修正がしやすい気がするのですが、まあ、どうでしょうね。
break はめんどうではありますが、or 条件が複数ある場合などは
少し短くできちゃったりしますしね。
で、つらつら長い条件比較が続いてるって場合は、コーディングではなくて
設計を見直すのかなって気がします。(余談ですが)

投稿2018/11/10 06:45

takasima20

総合スコア7458

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

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

0

ベストアンサー

フォールスルーを意図的に使って処理を合流させるようなコードを書く剛の者以外は、あまりメリットはないかもしれません。

ただ、C言語向けのコード生成ツールを使ったら、巨大なswitchを、フォールスルーで複雑に分岐合流させつつ進むコードになったものが出てきたことがあって、そのようなものでも(変数名を$ありに置き換えるなどの簡単な変更で)PHPに移植できたのは助かりました。

投稿2018/11/10 06:34

maisumakun

総合スコア145121

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

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

tomoyuki123

2018/11/10 08:41

皆様ありがとうございました!!
guest

0

動作速度はほとんど変わらないので,そこは論点ではありません。公式マニュアルにも書いてありますが,以下のようなパターンが特に問題となります。

  • 0 "" "0" false null など互いに型が違う falsy な値が case 条件として複数存在する場合
  • truthy でも 0 == "0abc" "1e2abc" == 100 "1e2" == "100" などの一致判定で問題となる場合 (コメントの指摘により追加)

これに該当しない場合は特に機能上のデメリットは無いと考えてください。

php

1$var = "0"; 2 3switch ($var) { 4 case 0: 5 $result = "this is integer zero"; 6 break; 7 case "0": 8 // ここは絶対通らない 9 $result = "this is string zero"; 10 break; 11} 12 13echo $result;

一番好きなのは**「早期リターン」**と呼ばれる書き方です。関数・メソッド・クロージャとしてこの部分だけ分割しているときに使えます。

php

1if ($var === 0) { 2 return "this is integer zero"; 3} 4if ($var === "0") { 5 return "this is string zero"; 6}

この場合, switch で書いても break が不要なので読みやすくなります。

php

1switch ($var) { 2 case 0: 3 return "this is integer zero"; 4 case 1: // 比較条件に問題が無い場合は switch で良い 5 return "this is integer one"; 6}

まとめると,

  • まずは適切にロジックを分割して早期リターンを積極的に採用する。この際 switch が問題なく使える場合は,早期リターンと組み合わせて if の代わりに使ったほうが見やすい場合が多い。
  • 早期リターンが使えない場合は,それほど積極的に switch を採用する理由はない。

投稿2018/11/10 06:33

編集2018/11/10 06:59
mpyw

総合スコア5223

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

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

maisumakun

2018/11/10 06:38

falsyでなくても、「1=='1a'」とか「'1'=='1.0'」とか、「数値文字列」まわりで思わぬものが一致することがあります。
mpyw

2018/11/10 06:55

truthy もありますね,修正しておきます
mpyw

2018/11/10 07:01

あとフォールスルーが役立つ場合も,確かに稀ではありますがありますね。値によって初期化を一部スキップしたりできる場面だと使えそうです。(ただやはり基本的には if で書いたほうが読みやすい)
guest

0

ぽえむ
JavaScript と逆な仕様なのが、両方使わざるを得ない phper には最悪の条件な気がする

投稿2018/11/10 06:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tomoyuki123

2018/11/10 08:34

すみません、書いてる日本語がよくわからず。。 PHPとJavaScriptの両方使うと混乱してしまうということでしょうか?
tomoyuki123

2018/11/10 08:40

なるほど、ありがとうございました! PHPの質問だったのでその辺り頭に入ってきませんでした。。
退会済みユーザー

退会済みユーザー

2018/11/10 08:45

まぁ、質問に関係ない独り言なんで気にしないでw
guest

0

if文が入れ子になっている際はSwitch文と併用することで可読性が上がると思います。

投稿2018/11/10 06:05

Nippun

総合スコア1147

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

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

0

シンプルなswitchまで落とし込めたら勝ちなんじゃないかと、Swift書いてて思った。

投稿2018/11/13 05:33

mesoshi

総合スコア56

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問