PHP
プログラミング
初心者
初心者向け
OriginalqnoteDay 12

【初心者必見】条件式を思い通りに書く3つの基本的なこと

あー、条件式書きたくなってきたなー!
うわっ!ちょうど式書くとこあるやん!書いてみよっと!ぽちっとな!(某芸人風)

と書き始めたはいいけれども、なんかよくわからん式ができました〜ってなっちゃう人に読んでもらいたい記事となっております。

優先順位

優先順位を意識していないと、思っているものとは違う結果が返ってきて
うーんうーんと首をひねることになります。

たとえば以下の式

$a = $b || $c;

\$b か \$c のどちらかが true であれば $a に true を代入する、という式です。
(決して\$b か \$c の値を代入するというわけではないですよ!)

値を代入するんだ!(*^◯^*) と勘違いしなければ特に難しくないものです。

では、以下の式はどうでしょうか?

$a = $b or $c;

感覚としては同じ「\$b か \$c のどちらかが true であれば $a に true を代入する」です。

何が違うんでしょうか?とりまとりあえず試してみましょう。

$a = false || true;
var_dump($a);      // (bool)true

$a = false or true;
var_dump($a);      // (bool)false

違うんかーい!
となったあなた、これには理由があるんです。

ここで差がつく!

上の例に出てきた =||or ですが、
どれも計算される優先順位が違うのです。

この3つの強さは
|| > = > or となっています。

つまり
$a = false || true; は 、
1. false || true が処理され true となる
2. $a = true となり、結果 true が返される

となりますが、

$a = false or true; は、
1. $a = false が処理され false となる
2. false or true が処理され true となる(けれども = が処理された後なので変数には入らない)
3. $a = false となっているので、結果 false が返される

ということなのです。奥が深いですね〜。

他の優先順位はどうなっているの??って興味が出た人は、
PHPマニュアル:演算子の優先順位を見ましょう!

結合方向

↑のリンク先を見てきた方は、
「結合ってなだろ??ちょっとやらs:thinking::thinking::thinking:
ってきっとなったことでしょう。きっとなったことでしょう!!

この結合が意味を成すのは複数使った演算子の優先順位が同じときです。
優先順位が違う場合には考慮されません。

優先順位が同じものが複数存在している時にどちらを先に演算するか決める、といえばわかりやすいでしょうか。

$b = $c = $d = 5;  // = の結合は「右」なので $d = 5 から計算される
$a = $b + $c - $d; // + - の結合は「左」なので $b + $c から計算され、 $a = 5 になる

また、「結合しない」というものもあったかと思いますが、いまいちピンとこないと思います。
これも、「一緒に計算することはできない」等と置き換えて読むといいかもです。

例えば

if (30 < $a < 100) {}

こうやりたかった人はいると思うのですけれども(というか自分がしたかった)
< は「結合しない」グループに属しているので、
30 < $a の後に$a < 100 を処理するということはできないのです。

なのでみんな
30 < $a || $a < 100 等とするわけなのです。

ここで差がつく!

結合方向を理解していれば、今まで別々に書いていたあんな式やこんな式なども
うまくまとめることができます。

  • 優先順位が同じで結合方向が〜
    • 「右」:右から計算していく
    • 「左」:左から計算していく
    • 「結合しない」:一緒には計算できない
どちらも同じ
$a = 5;
$a += 3;
$b = $a;

$a = 5;
$b = $a+= 3;
どちらも同じ
$a = 1;
$b = 1;
$c = 1;

$a = $b = $c = 1;

(夢が広がるほどではないですけど)
(多用しすぎると逆にみにくくなるので注意)

無理に否定しない

たとえば、 『りんごとみかん、どちらかを持っているか』という式を書くと

if ($apple === true || $orange === true){}

となります。
で、これを否定する式を書くということになったときに、安直に書くと

if (!($apple === true || $orange === true)){}

って書いちゃう人、結構いると思います。(というか自分がs略)

でもこれ、ややこしくないですか?
僕は頭がフットーしそうになります。

「『りんごかみかんのどちらかを持っている』じゃないやつが true になるから……
えっとつまり……どゆこと??」
って考えちゃいます。

上の式に限って言えば、
「りんごかみかんのどちらかを持っている」のは false
つまり、
「りんごとみかんのどちらも持っていない」のであれば true
と読み替えることができます。

ということは、

if (!($apple === true || $orange === true)){}

if ($apple !== true && $orange !== true) {}

と書くことができます。
気づきましたか?『君の名は。』ばりに色々入れ替わっていますね。

ここで差がつく!!

このように真⇔偽、論理積⇔論理和を入れ替えることを『ド・モルガンの法則』と呼びます。(ちょっと説明が乱暴だけど)

ド・モルガンの法則
not(a or b or c)  (not a) and (not b) and (not c)
not(a and b and c)  (not a) or (not b) or (not c)

僕がリア充かイケメンか金持ちのどれか、ではない場合、
リア充でもない、イケメンでもない、金持ちでもないってことだよ!!!

ということで

  • 優先順位
  • 結合方向
  • ド・モルガンの法則

の3つを紹介しました。
まだまだ他にも改善する方法はたくさんあるのですが、
初心者のうちは、この3つを覚えておくだけでも見違えるようになることでしょう。

めっちゃきれいな式できた〜:relaxed:ってなるように頑張りましょう!