empty($var)は、変数が存在しないか、その値がfalseと評価されるもの(null、false、0、0.0、""、"0"、空の配列[])であればtrueを返します。それ以外の値にはfalseを返します。isset()と同じく、未定義の変数や配列キーについて警告は出しません。
empty($x)は!isset($x) || !$xと同じです。つまり、存在しないか、falseに変換されるかです。
空とみなされる値
表で値を選ぶと、empty()をisset()や(bool)キャストと並べて確認できます。すべてのセルはPHP 8.3で計算したものです。
| $x | empty | isset | bool |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| 0.0 | |||
| "" | |||
| "0" | |||
| [] | |||
| " " | |||
| "0.0" | |||
| "a" | |||
| "null" | |||
| [0] | |||
| 1 | |||
| -1 |
意外なのは両端です。"0"は空ですが、" "(空白1つ)、"0.0"、"null"、[0]は空ではありません。
"0"は空:定番のバグ
"0"はfalseと評価されるので、empty()は数量の0、得点の0、暗証番号の"0"を「何も入力されていない」とみなします。すべての値が文字列で届くフォームで問題になります。
テキスト入力で「何も入力されていない」を確実に判定するにはtrim($value) === ""を使います。empty()は、0が本当に「何もない」を意味する値に使いましょう。
文字列が空か確認する
文字列が空かを正確に判定するには、""と比較します。空白も空とみなすなら、先にtrimします。PHP 5.5以降はempty()が式を受け付けるのでempty(trim($s))も動きますが、同じ"0"の問題があります。
PHP 8.1以降、trim()にnullを渡すと非推奨の通知が出るので、このブロックではtrim($s ?? "")と書いています。
配列が空か確認する
配列では、empty($arr)、$arr === []、count($arr) === 0はどれも同じ答えを返します。empty()には、存在しないかもしれない変数やキーにも使えるという利点があります。
コールバックなしのarray_filter()はfalseと評価される値をすべて取り除くので、「この配列に中身のある値が入っているか」を手早く確かめられます。
必須のフォーム項目を検証する
0が正当な答えでない限り、!empty()は項目を必須にするよく使われる方法です。このブロックを実行し、項目を空のままSendを押してから、入力してもう一度送信してください。$_POSTに値が入った状態でスクリプトがもう一度実行されます。
チェックボックスについては、empty($_POST["terms"])が両方のケースをカバーします。まったく送信されなかった場合と、空の値で送信された場合です。項目ごとのエラーメッセージなど、さらに進んだ内容はフォームのページにあります。
emptyとissetの違い
どちらも未定義の変数やキーに安全に使えます。答える問いが違います。
isset($x):存在してnullでないか。任意のキー、チェックボックス、「そもそも送信されたか」に使います。!empty($x):存在してtrueと評価されるか。0や"0"を数に入れない「中身があるか」に使います。$x === ""や$x === []:ぴったり空か。0が正当な値のときに使います。
もう半分についてはissetのページで、複数の変数を一度に確認するisset()やarray_key_exists()との違いも含めて扱っています。
よくある質問
PHPのempty()は、どの値を空とみなしますか?
empty($x)は、$xが存在しないか、null、false、0、0.0、""、"0"、[]のときtrueです。それ以外は空ではなく、" "(空白1つ)、"0.0"、"false"、[0]も空ではありません。
PHPで"0"が空になるのはなぜですか?
empty()は、未定義の変数に対する警告がない点を除けば!$xと同じで、文字列"0"はfalseに変換されるからです。そのため0が正当な答えである項目にはempty()は不向きです。代わりに$x === ''かtrim($x) === ''で確認します。
PHPで配列が空か確認するには?
empty($arr)でも$arr === []でも、count($arr) === 0でも判定できます。empty()は変数が設定されていないときもtrueを返しますが、未定義の変数にcount()を使うと警告が出たうえで、nullに対してTypeErrorが投げられます。
isset()ではなくempty()を使うのはどんなときですか?
値が存在することだけ知りたいとき(チェックボックスが送信された、設定のキーがある)はisset()を使います。値が空でないことも必要なとき、たとえば必須のテキスト欄には!empty()を使います。empty('0')はtrueなので、0が正当な値である項目には注意してください。