functionのswitch - PHPプロ!Q&A掲示板

4871

  • 0P

functionのswitch

質問日時 / 2017年10月6日 18:36    回答数 / 1件

Questioner:  kesuikeutosa  このエントリーをはてなブックマークに追加 

キーワード / function    switch   

<?php
function a($a){
 switch($a):
   case 0 <= 3 : return "あ";
   case 4 <= 6 : return "い";
 endswitch;
}
echo  a(5);
?>

なぜ、こういう文はエコーされないのでしょうか?
教えてください。お願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

Qfunctionのswitchkesuikeutosa
┗A01shimixswitch/caseの動作を誤解されていると思います。 s

回答一覧

並び替え:

A01 満足
answerershimix [10月6日 19:40] (最終編集:10月10日 11:54)

switch/caseの動作を誤解されていると思います。

switch/caseの場合、swicthに渡された変数とcaseに書かれた式の比較を行って一致すれば実行されます。整数を書けば値の比較になりますが、論理式を書けば論理比較になります(この比較はマニュアルに記載されているとおり「緩やかな比較」ですので)。


>   case 0 <= 3 : return "あ";
>   case 4 <= 6 : return "い";

最初の 0 <= 3 という論理式は($aの値とは無関係に)真ですよね。$aの論理値も真(整数値の5は論理値としては真)なので、この比較が一致となりこの時点でreturnします。

今のソースに忠実にcase部分を書き直すなら
  1. function a($a){
  2.  switch($a):
  3.    case (0 <= $a)and($a <=3) : return "あ";
  4.    case (4 <= $a)and($a <=6) : return "い";
  5.  endswitch;
  6.  return "NG";
  7. }
ではないですかね(当然、switchに$aを書いている意味はなくなります)。ただし$aが0のときの動作は要注意です(以下で説明します)。



ソースを書いて試してみました。
  1. <?php
  2. for ($i = 0$i < 9$i++) {
  3.   printf('%d:%s:%s:%s<br>'$ia($i)b($i)c($i));
  4. }
  5.  
  6.  
  7. function a($a){
  8.  switch($a):
  9.    case (0 <= $a)and($a <=3) : return "";
  10.    case (4 <= $a)and($a <=6) : return "";
  11.  endswitch;
  12.  return "NG";
  13. }
  14.  
  15. function b($a){
  16.  switch($a):
  17.    case $a <=3 : return "";
  18.    case $a <=6 : return "";
  19.  endswitch;
  20.  return "NG";
  21. }
  22.  
  23. function c($a){
  24.  switch($a):
  25.    case 0:
  26.    case 1:
  27.    case 2:
  28.    case 3:
  29.        return "";
  30.    case 4:
  31.    case 5:
  32.    case 6:
  33.        return "";
  34.  endswitch;
  35.  return "NG";
  36. }
結果

0:い:NG:あ
1:あ:あ:あ
2:あ:あ:あ
3:あ:あ:あ
4:い:い:い
5:い:い:い
6:い:い:い
7:NG:NG:NG
8:NG:NG:NG


値が 0 のときだけちょっと動作が違いますね。

(function a)
case (0 <= $a)and($a <=3) が trueで0(false)と一致しないので、次のcase (4 <= $a)and($a <=6)がfalseで0(false)と一致したところで抜けています。

(function b)
case $a <= 3 や $a <= 6 は全部真ですが、$aがfalse(0)なので最後まで一致しません。

【 結 論 】
整数値としてチェックしたいなら(複数の値との比較であっても)function c のように値を列挙するのが無難です。それが面倒なら switch/case はあきらめて素直に if で書くべきでしょうね。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)