こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

三項演算子(PHP)について

次の判定をしたいのですが、正しい値が返ってきません。
PHPマニュアルには「三項演算子を"積み重ねて"使用することは避けましょう。ひとつの文の中で複数の三項演算子を使用した際のPHPの振る舞いは、少々わかりにくいものです。」という記述がありますが、PHPで正しく判定する方法はありますか。

(1) 総所得金額($income)が、33万円($deduction)を超えない世帯は、7割軽減されます。
(2) 総所得金額が、33万円に被保険者($people)(当該納税義務者を除く。)1人につき245,000円を加算した金額を超えない世帯は、5割軽減されます。
(3) 総所得金額が、33万円に被保険者1人につき35万円を加算した金額を超えない世帯は、2割軽減されます。

$income = $income <= $deduction ? '0' : $income - $deduction;
$judge = ($income = '0') ? '7割軽減' :
($income < ($people - 1) * '245000') ? '5割軽減' :
($income < $people * '350000') ? '2割軽減' : '';

PHP マニュアル
http://www.php.net/manual/ja/index.php

投稿日時 - 2013-12-11 13:41:56

QNo.8382081

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(5)

ANo.5

> 「大人しく」の意味が分かりません。
ご存じのように、条件が単純な場合は三項演算子を使うことでシンプルなコードを書くことができます。

が、複数の条件が重なる場合などはif文を使った方が可読性が上がりますし(自分にとっても、他人にとっても)、
可読性が上がることで論理バグを防ぐことができます。

シンプルさを追求することも大事ですが、最も優先すべきはクオリティではないでしょうか?

投稿日時 - 2013-12-12 12:02:43

ANo.4

他の多くの言語の三項演算子は、右結合なので if a then b elseif c then d else e のように直感的に使用できますが、PHPの三項演算子はマニュアルに繰り返し書いているように左結合なので、あなたのしたいようにするには括弧をたくさん付ける必要があります。

他の言語では、こう書くところが、
a ? b : c ? d : e

PHPでは、こう書く必要がある。
a ? b : ( c ? d : e )

>「三項演算子を"積み重ねて"使用することは避けましょう。ひとつの文の中で複数の三項演算子を使用した際のPHPの振る舞いは、少々わかりにくいものです。」

マニュアルページのその文のすぐ下にわかりやすい例があるのに、目に入らなかったのでしょうか?

投稿日時 - 2013-12-12 00:17:44

お礼

回答ありがとうございました。
正しく判定することができました。
PHPを使い初めて3日目で、マニュアルのやりたい項目だけしか見ていませんでした。また、恥かしながら、わかりやすい例が目に入ってもほとんど理解できません。
「if」よりも「三項演算子」のほうがシンプルそうだったので使ってみました。

投稿日時 - 2013-12-12 11:31:43

ANo.3

#2 の通りだろうね.

ちなみに「正しい値が返ってきません」のような表現は質問としてよくない.
・どのような状況で
・どのような値が得られることを期待していて
・実際にはどのような値が得られたのか
くらいは書けるはず (だし明確な答えがほしければ書くべき).

投稿日時 - 2013-12-11 14:56:49

補足

投稿日時 - 2013-12-11 17:37:06

ANo.2

あ、あとここは明らかに間違っています。
 × $judge = ($income = '0') ? '7割軽減' :
 ○ $judge = ($income == '0') ? '7割軽減' :

投稿日時 - 2013-12-11 14:02:42

補足

投稿日時 - 2013-12-11 17:33:55

ANo.1

中身は見ていませんが、大人しくif文を使えばいいのでは?
三項演算子にこだわる必要はありますか?

投稿日時 - 2013-12-11 13:59:36

補足

「大人しく」の意味が分かりません。

投稿日時 - 2013-12-11 17:34:57

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-