Menu

PHPのif・elseif・else文:条件分岐の書き方と例

if (条件) { ... } は条件がtrueのときだけブロックを実行し、elseifは次の条件を調べ、elseはどれにも当てはまらなかったときに実行されます。elseifとelse ifの違い、&&と||、trueと評価される値、HTMLテンプレート用のif: endif;構文を扱います。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

if (condition) { ... }は、条件がtrueのときだけブロックを実行します。ほかのケースにはelseif (other condition) { ... }を、残りすべてにはelse { ... }を追加します。PHPは上から条件を調べ、最初に当てはまったブロックだけを実行します。

$temperatureを変えてもう一度実行してみてください。上から順に調べるので、24は2つ目の条件で止まり、>= 10もtrueなのにそこまでは進みません。条件は、限定的なものから一般的なものへの順に並べましょう。

elseifとelse ifの違い

波括弧を使う場合、elseifとelse ifは同じことをします。else ifは厳密には本体が新しいifであるelseですが、結果は同じです。

違いが出るのは、テンプレートで使うコロン構文(次の節以降)だけです。そこではelse ifがコードを壊します。

<?php $score = 72; ?>
<?php if ($score >= 90): ?>
    <p>A</p>
<?php else if ($score >= 60): ?>
    <p>Passed</p>
<?php endif; ?>
PHP Parse error:  syntax error, unexpected token "if", expecting ":" in /home/index.php on line 4

elseifと1語で書けば、このエラーに出会うことはありません。

&&と||で複数の条件

&&(かつ)は両辺がtrueであることを、||(または)は少なくとも一方を必要とし、!は条件を反転します。PHPは答えがわかった時点で評価をやめるので、$user !== null && $user['active']では、ユーザーがいるときだけ2つ目の部分が実行されます。

&&と||を混ぜるときは括弧を付けましょう。&&のほうが強く結びつきますが、括弧があれば次に読む人にも意図が明らかになります。PHPにはandとorというキーワードもありますが、=より優先順位が低いので、$ok = true and false;は$okをtrueにします。&&と||を使いましょう。

ifでtrueとみなされるもの

条件はboolでなくてもかまいません。PHPが変換し、ごく一部の値がfalseとみなされます:false、0、0.0、""、"0"、[]、null。それ以外はすべてtrueで、"false"、" "、"0.0"もtrueです。

if ($x) は各値をどう見るか
Point at or tap a cell to read it as PHP.
$xboolempty
false
0
0.0
""
"0"
null
[]
" "
"0.0"
"a"
[0]
1
Every cell computed by PHP 8.3.19.

if ($items)が「配列が空でない」の意味でよく使われるのはこのためです。問題になるのは"0"の行です。誰かが0と入力したフォームの項目は空でない文字列ですが、if ($_POST['qty'])はそれをfalseとして扱います。0が正当な答えである場合は、明示的に比較してください(if ($qty !== ''))。empty()が返す値も同じルールで決まります。

if: と endif; でHTMLの中にif else

HTMLタグの間では、波括弧を見失いがちです。PHPには別の構文があります。条件のあとにコロン、ほかの分岐にはelseif ...:とelse:、最後にendif;です。このブロックを実行してから、Pageタブの点数をクリックしてください。各リンクは新しい$_GET['score']で同じスクリプトをもう一度実行します。

<?= $score ?>は<?php echo $score; ?>の短縮形です。同じコロン形式はループにもあり(foreach: endforeach;、while: endwhile;)、ほとんどのPHPテンプレートで使われています。

1行のifと三項演算子

文が1つだけなら、波括弧なしで条件のあとに書けます。動きはしますが、次に追加した行はifの中に入らないので、多くのスタイルガイドは常に波括弧を付けることを求めています。2つの値から1つを選ぶなら、三項演算子のほうが完全なif/elseより短く書けます。

1つの変数を多くの値と比較する場合は、長いelseifの連鎖よりmatch式のほうが読みやすくなります。

ネストせずに早めにreturnする

深くネストしたifブロックは追いにくくなります。関数の中では、失敗するケースを先に確認してすぐにreturnしましょう。そうすれば、本来の処理が左端にそろいます。

よくあるミス:条件で==の代わりに=を使う

=が1つだと代入です。if ($role = 'admin')は$roleに'admin'を入れてからその文字列を判定するので、trueになります。すべてのユーザーでブロックが実行され、しかも$roleの値も壊れます。

型の自動変換を望む理由がなければ、比較には===を使います。定数を先に書く人もいます(if ('admin' === $role))。そうすれば=が1つ抜けたときに、黙って代入されるのではなくエラーになります。

よくある質問

PHPのelseifとelse ifの違いは何ですか?

波括弧を使う場合は同じ動きです。else ifは、本体が別のifであるelseです。コロン構文(if (...): ... endif;)ではelseifしか動かず、else ifは構文エラーです。どこでもelseifを使えば、この違いを気にせずにすみます。

PHPのif文で複数の条件を確認するには?

&&(すべてtrue)か||(少なくとも1つ)でつなぎます:if ($age >= 18 && $hasTicket) { ... }。2つを混ぜるときは括弧を使います。たとえばif ($isAdmin || ($isOwner && $isActive))です。

PHPでif文を1行で書くには?

文が1つだけなら、波括弧なしで条件のあとに書けます:if ($debug) echo 'debug mode';。1行で2つの値から選ぶには三項演算子を使います:$label = $count === 1 ? 'item' : 'items';。

PHPでHTMLの中にif elseを書くには?

HTMLタグの間で読みやすい別の構文を使います:<?php if ($loggedIn): ?> <p>Welcome back</p> <?php else: ?> <a href="/login">Log in</a> <?php endif; ?>。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める