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

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

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

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

Q&A

解決済

4回答

2355閲覧

PHPの条件分岐で分岐が上手く機能しない

Mcgregor

総合スコア31

PHP

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

0グッド

0クリップ

投稿2017/12/29 10:31

お世話になっております。
単純なif文の条件分岐なのですが、何故か思い通りに動いてくれません。
教本やネットで調べて、色々試したのですが上手くいかず。
ご助言をいただけると助かります。
またシンプルな記述等あれば教えていただけると幸いです。

状況
変数3つ
$a,$b,$cの代入された値に応じて分岐をしたいと思っています。
それぞれの変数には以下の様に値が入ります。
$a = 0以上の数字、もしくはallという文字列
$b = 0以上の数字、もしくはallという文字列
$c = 文字列、もしくはallという文字列

以下、2つのコードを試したのですが、上手く分岐しませんでした。

PHP

1if (($a >= 0) && ($b >= 0) && ($c != 'all')) { 2 echo "int, int, not all"; 3} elseif (($a >= 0) && ($b == 'all') && ($c == 'all')) { 4 echo "int, all, all"; 5} elseif (($a == 'all') && ($b >= 0) && ($c == 'all')) { 6 echo "all, int, all"; 7} elseif (($a == 'all') && ($b == 'all') && ($c != 'all')) { 8 echo "all, all, not all"; 9} elseif (($a >= 0) && ($b >= 0) && ($c == 'all')) { 10 echo "int, int, all"; 11} elseif (($a >= 0) && ($b == 'all') && ($c != 'all')) { 12 echo "int, all, not all"; 13} elseif (($a == 'all') && ($b >= 0) && ($c != 'all')) { 14 echo "all, int, not all"; 15} elseif (($a == 'all') && ($b == 'all') && ($c == 'all')) { 16 echo "all, all, all"; 17}

このコードだと$cの値が正常に分岐しれくれません。

PHP

1if (($a == 'all') && ($b == 'all')) { 2 if ($c == 'all') { 3 echo "all, all, all"; 4 } else { 5 echo "all, all, not all"; 6 } 7} elseif (($a >= 0) && ($b >= 0)) { 8 if ($c == 'all') { 9 echo "int, int, all"; 10 } else { 11 echo "int, int, not all"; 12 } 13} elseif (($a >= 0) && ($b == 'all')) { 14 if ($c == 'all') { 15 echo "int, all, all"; 16 } else { 17 echo "int, all, not all"; 18 } 19} elseif (($a == 'all') && ($b >= 0)) { 20 if ($c == 'all') { 21 echo "all, int, all"; 22 } else { 23 echo "all, int, not all"; 24 } 25}

こちらのコードだと、$bの値が分岐してくれないという状況です。

最初はswitchで書くのが短く綺麗になるかと考えたのですが、
書き方が思いつかず、if文の力技で書いた次第です。

私がそもそもこの記述が間違ってるかどうか、あまり判断がついていないレベルで、
教本やネットの記述を真似て必要に応じ書き換えて試したのですが、
どうも解決に至らないので、お力添えをよろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

解決済みではありますが、

正常分岐しない理由としては

PHP比較演算子

にある
=====の使い分けが出来ていないからの様に思われます。
>= 0は整数値であるかどうかを判定するには不適切な条件です。

例えば、以下のコードの場合、二つ目のifではallが数値と判定されます。
比較演算子についてはリンクの公式マニュアルに詳細な記述があるので、参考になるかと思います。

PHP

1<?php 2 3$a = 0; 4if($a >= 0){ 5 echo "a is int".PHP_EOL; 6} 7 8$a = "all"; 9if($a >= 0){ 10 echo "a is int".PHP_EOL; 11}else{ 12 echo "a is all"; 13}

実行結果

a is int
a is int

投稿2017/12/29 11:22

tanat

総合スコア18713

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

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

Mcgregor

2017/12/29 11:27

とても勉強になりました。 原因がわかったので、とてもスッキリしました。 単純な比較だけでも、しっかりと理解や知識がなかったことがわかりました。 ありがとうございます。
guest

0

「こういった書き方もあるんだな」くらいに思って流し読みしてみてください

php

1<?php 2 3function filterValue($ar) { 4 // 配列に対して 関数(無名関数)の処理を適用 5 // 値を if で判別して文字列に変換する 6 $ret = 7 array_map(function($elm) { 8 if($elm === 'all') { return 'all'; } 9 else if(is_int($elm) && $elm >= 0) { return 'int'; } 10 else { return 'not all'; } 11 }, $ar); 12 // 配列を指定した文字列で区切りながら1つの文字列として結合 13 return implode(', ', $ret); 14} 15 16// Memo: 17// * $a, $b, $c 含めた取りうる値 18// - 0以上の数字, all あるいはその他の文字列 19// * $a, $b, $c の値をもとに変換する値の種類 20// - 0以上 -> 'int' 21// - 'all' -> 'all' 22// - 'foo' -> 'not all' (all 以外の任意の文字列) 23 24// list 関数で配列と対応付けた値の代入処理 25list($a, $b, $c) = ['all', 1, 'foo']; 26 27// 定義した関数の呼び出しと戻り値の出力 28echo filterValue([$a, $b, $c]); // => all, int, not all

ポイントとして:

  • 「与えられた値をもとに別の値に変換する」というのは、それだけで関数を1つ設ける大きな処理の塊です
  • 幾つかの値を同じようなルールで処理するというのは、それらへの対応を個別に定義するのではなく、ループ処理の出番です

PHP が標準で用意している関数は数多くあるので、少しでもそれを知ることが簡潔なコードを書く近道なのかもしれません

何か参考になれば幸いです

Links

投稿2017/12/29 11:21

編集2017/12/29 11:27
gouf

総合スコア2321

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

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

Mcgregor

2017/12/29 11:23

ありがとうございます。 やはり教本に載ってることだけだと、 少しでも複雑な動作をしようとした時に冗長なコードになりがちですが、 おっしゃられるように、様々な関数を学ぶことが簡潔なコードを書く近道なのでしょう。 引き続き精進してまいります。
guest

0

kei344 さんも書いてくれてますが、まとめて評価するより、それぞれを評価したものをくっつけるといったアプローチのほうがきれいになります。

投稿2017/12/29 11:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Mcgregor

2017/12/29 11:15

ご教示いただいた方法で新たに試してみようと思います。 因みにですが、上記の記述が何故正常に分岐できないか、 よくわからないのですが、もしわかれば教えていただけると助かります。
退会済みユーザー

退会済みユーザー

2017/12/29 11:22

うーん。正直見る気になりません^^; 条件式が、ごちゃごちゃしている上、`==` が入っているので。。。 こういった条件は「どうきれいに書くか」と条件式は「型変換の無い式で評価する」事が重要です。
退会済みユーザー

退会済みユーザー

2017/12/29 11:33

これやってみるとイイですよ。 <?php echo "0 == 'all' : "; var_export(0 == 'all'); echo PHP_EOL; echo "1 == 'all' : "; var_export(1 == 'all'); echo PHP_EOL; echo "1 == '1all' : "; var_export(1 == '1all');
guest

0

ベストアンサー

こういうことでしょうか。

PHP

1echo ( $a === 'all' ? 'all' : 'int' ).', '.( $b === 'all' ? 'all' : 'int' ).', '.( $c === 'all' ? 'all' : 'not all' );

投稿2017/12/29 10:42

kei344

総合スコア69398

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

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

Mcgregor

2017/12/29 11:13

ご回答ありがうございます。 それぞれの処理をecho ”int, int, all”の箇所に記述つもりでいます。 ご教示いただいたコードで変数の値を判定して、それを元に条件分岐を行う様に 修正してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問