PHP

PHPのisset()とempty()の違い|フォームや配列の値チェックを使い分ける方法

PHPのisset()とempty()は、フォーム入力や配列要素の確認で使われる関数です。判定対象と目的の違いを具体例で整理し、実装時の選び方を解説します。

この記事でわかること

  • isset()は変数や配列要素が存在し、nullではないかを確認する用途に向いている。
  • empty()は値が空とみなされるかを確認する用途に向いている。
  • フォーム値の必須チェックでは、空文字・0・falseなどをどう扱うかを先に決めてから関数を選ぶ。
  • 配列要素の存在確認と入力値の妥当性検証は、必要に応じて分けて考える。

isset()とempty()は何を確認する関数か

isset()は、変数や配列要素が設定されており、値がnullではないかを確認します。未定義の変数やnullに対してはfalseになります。一方、empty()は、対象が未定義、またはfalse・0・空文字列・空配列など、PHP上で空とみなされる値かを確認します。

PHP
<?php
$value = 0;

var_dump(isset($value)); // bool(true)
var_dump(empty($value)); // bool(true)

// 実行結果例:
// bool(true)
// bool(true)

この例では、0という値自体は設定されているためisset()はtrueです。しかし、empty()では0が空とみなされるためtrueになります。

値ごとの判定結果を一覧で比較する

値isset()empty()判定の意味
未定義の変数falsetrue値が存在しない
nullfalsetrue設定されているが、nullは存在しない値として扱われる
空文字列 “”truetrue変数は存在するが、空文字列は空とみなされる
文字列 “0”truetrue文字列でも0は空とみなされる
整数 0truetrue0はempty()で空とみなされる
falsetruetruefalseは空とみなされる
空配列 []truetrue配列は存在するが、空配列は空とみなされる
文字列 “PHP”truefalse値が存在し、空ではない
isset()とempty()の代表的な判定結果

特に注意したいのは、isset()がtrueになる0やfalseでも、empty()はtrueになる点です。数量の0やチェックボックスのfalseを有効値として扱う場合、empty()だけで必須チェックを行うと意図と異なる判定になる可能性があります。

フォーム入力ではどちらを使うべきか

フォーム値が送信されたかだけを確認したい場合は、isset($_POST[‘name’])が候補になります。空文字列も未入力として扱いたい場合は、empty($_POST[‘name’])が候補です。ただし、空白だけの文字列や入力値の形式・長さ・範囲までは、これらの構文だけでは検証できません。

PHP
<?php
$_POST['name'] = '';
$_POST['quantity'] = '0';

var_dump(isset($_POST['name']));      // bool(true)
var_dump(empty($_POST['name']));      // bool(true)
var_dump(isset($_POST['quantity']));  // bool(true)
var_dump(empty($_POST['quantity']));  // bool(true)

// 実行結果例:
// bool(true)
// bool(true)
// bool(true)
// bool(true)

必須項目の確認では、まず「0を許可するか」「falseを有効値として扱うか」「空白だけの入力を拒否するか」を決めます。たとえば名前ならtrim()後の空文字列を確認し、数量なら数値への変換後に範囲を検証するなど、要件に合わせて処理を分けます。

配列や設定値のチェックでの使い分け

配列キーが存在し、値がnullではないことを確認したい場合はisset()を使えます。ただし、キーが存在していて値がnullの場合、isset()はfalseになります。nullも含めてキーの存在そのものを確認したい場合は、array_key_exists()を使います。

PHP
<?php
$options = [
    'timeout' => null,
    'retries' => 0,
];

var_dump(isset($options['timeout']));
var_dump(array_key_exists('timeout', $options));
var_dump(isset($options['retries']));

// 実行結果例:
// bool(false)
// bool(true)
// bool(true)

設定値が未設定または空の場合に既定値へ切り替える処理ではempty()が便利な場合もあります。しかし、0やfalseを有効な設定値として使うなら、empty()ではなくisset()や値の型に応じた比較を検討します。

この流れでは、まず値を利用できるかをisset()で確認し、nullという値自体を区別したい場合だけarray_key_exists()を使います。

迷わず選ぶための判断手順と実装上の注意点

  1. 存在しているかを確認したいなら、isset()を候補にする。
  2. 未定義または空として扱う値かを確認したいなら、empty()を候補にする。
  3. 0、false、空配列、nullを有効値として扱うかを要件に明記する。
  4. 形式・長さ・範囲の検証は、isset()やempty()とは別に実装する。

迷ったときは、「存在確認」「空判定」「入力値の妥当性検証」のどれが目的かを切り分けます。isset()とempty()は似ていますが、0やfalseの扱いが異なるため、関数名だけで選ばず、実際に許可する値を基準に判断することが重要です。

参考