PHPで配列の要素の存在をチェックする方法について

採用はこちら

PHPで配列を扱っていると、「指定したキーが存在するか」「特定の値が配列に含まれているか」を確認したい場面が頻繁にあります。
PHPには配列の存在チェックに利用できる方法が複数あり、何を確認したいのかによって適切な方法が異なります。

代表的なのは、isset()array_key_exists()in_array()の3つです。
さらに、値が存在する位置まで知りたい場合にはarray_search()、存在しない場合に初期値を使いたい場合にはnull合体演算子??も利用できます。

配列を安全に扱うためには、「キーの存在を確認したいのか」「値の存在を確認したいのか」を最初に区別することが重要です。

目次

PHPで配列のキーが存在するかチェックする方法

PHPで配列のキーをチェックする代表的な方法は、isset()array_key_exists()です。
どちらも似ていますが、配列要素の値がnullだった場合の動作が異なります。

isset()で配列要素をチェックする

isset()は、指定した配列要素が設定されていて、なおかつ値がnullではないことを確認するために使用します。

基本的な書き方は次のとおりです。

$user = [
    'name' => 'Taro',
    'age' => 20
];

if (isset($user['name'])) {
    echo 'nameは存在します';
}

この例では、nameというキーが存在し、値としてTaroが設定されているため、isset()trueになります。

存在しないキーをisset()で確認する

存在しない配列要素をisset()で確認した場合はfalseになります。

$user = [
    'name' => 'Taro'
];

var_dump(isset($user['email']));

結果は次のとおりです。

bool(false)

存在しないキーを直接読み取ると警告が発生することがありますが、isset()を使えば安全に存在を確認できます。

値がnullの場合はfalseになる

isset()を使ううえで特に重要なのが、nullの扱いです。

$user = [
    'name' => null
];

var_dump(isset($user['name']));

結果は次のようになります。

bool(false)

この場合、nameというキー自体は存在しています。
しかし、値がnullであるためisset()falseを返します。

つまり、isset()は単純に「キーが存在するか」を確認するものではありません。
「配列要素が設定されていて、その値がnullではないか」を確認するための構文です。

array_key_exists()でキーの存在そのものを確認する

配列の値がnullであっても、キーそのものが存在するかを確認したい場合はarray_key_exists()を使用します。

array_key_exists()の基本的な使い方

基本的な書き方は次のとおりです。

$user = [
    'name' => null
];

if (array_key_exists('name', $user)) {
    echo 'nameというキーが存在します';
}

この場合、nameの値はnullですが、キーそのものは配列に存在しています。
そのためarray_key_exists()trueになります。

isset()とarray_key_exists()の違い

isset()array_key_exists()の違いは、値がnullの場合に明確になります。

$array = [
    'name' => null
];

var_dump(isset($array['name']));
var_dump(array_key_exists('name', $array));

結果は次のとおりです。

bool(false)
bool(true)

それぞれの違いを整理すると、次のようになります。

配列の状態isset()array_key_exists()
キーあり・通常の値truetrue
キーあり・値が0truetrue
キーあり・値がfalsetruetrue
キーあり・値が空文字truetrue
キーあり・値がnullfalsetrue
キーなしfalsefalse

値がnullになる可能性がなく、「値を利用できるか」を確認したい場合にはisset()が便利です。
一方、nullも有効な値として扱いながらキーそのものの有無を確認したい場合にはarray_key_exists()が適しています。

in_array()で配列の値が存在するかチェックする

isset()array_key_exists()は、主にキーを基準として存在を確認します。
配列の中に特定の「値」が含まれているかを調べたい場合にはin_array()を使用します。

in_array()の基本的な使い方

例えば、次の配列にorangeが含まれているかを確認してみます。

$fruits = [
    'apple',
    'orange',
    'banana'
];

if (in_array('orange', $fruits, true)) {
    echo 'orangeが存在します';
}

orangeが配列内に存在しているため、条件はtrueになります。

第3引数trueで厳密比較を行う

in_array()には第3引数があり、trueを指定すると値だけでなく型まで含めて比較できます。

$array = [
    1,
    2,
    3
];

var_dump(in_array('1', $array));
var_dump(in_array('1', $array, true));

第3引数を省略した場合は、型変換を伴う比較になる場合があります。
一方、trueを指定すると厳密比較になるため、文字列の'1'と整数の1は別の値として扱われます。

意図しない型変換による判定を防ぎたい場合は、次のように書くとよいでしょう。

if (in_array($value, $array, true)) {
    // 値と型の両方が一致した場合
}

特別な理由がなければ、型を明確に区別する処理では第3引数にtrueを指定すると安全です。

array_search()で値が存在するキーを取得する

配列に特定の値が存在するかだけでなく、その値がどのキーやインデックスに格納されているかを調べたい場合はarray_search()を使用できます。

array_search()の基本的な使い方

例えば、次の配列でorangeの位置を調べてみます。

$fruits = [
    'apple',
    'orange',
    'banana'
];

$key = array_search('orange', $fruits, true);

var_dump($key);

結果は次のようになります。

int(1)

orangeがインデックス1に存在していることが分かります。

falseとの厳密比較が必要

array_search()を使用するときに注意したいのが、戻り値です。

値が見つからなかった場合、array_search()falseを返します。
一方、配列の先頭で値が見つかった場合には0を返すことがあります。

そのため、次の書き方は適切ではありません。

if (array_search('apple', $fruits, true)) {
    echo '見つかりました';
}

appleがインデックス0に存在している場合、戻り値は0です。
PHPでは0は条件式で偽として評価されるため、値が見つかっているにもかかわらず条件が成立しません。

正しくは、次のようにfalseとの厳密比較を行います。

$key = array_search('apple', $fruits, true);

if ($key !== false) {
    echo '見つかりました';
}

array_search()を使用する場合は、!== falseで判定することが重要です。

連想配列の要素の存在をチェックする方法

PHPでは、ユーザー情報や設定値などを連想配列で管理することがよくあります。

例えば、次のような配列があるとします。

$user = [
    'name' => 'Taro',
    'email' => 'taro@example.com',
    'age' => 20
];

値を利用できるか確認する

emailが存在し、値がnullではないことを確認したい場合はisset()を使用します。

if (isset($user['email'])) {
    echo $user['email'];
}

キーそのものの存在を確認する

値がnullである可能性も含めて、emailというキーが存在するかを確認したい場合はarray_key_exists()を使用します。

if (array_key_exists('email', $user)) {
    echo 'emailキーが存在します';
}

複数の要素をまとめてisset()で確認する

isset()では、複数の配列要素を一度に確認することもできます。

if (isset($user['name'], $user['email'])) {
    echo 'nameとemailの両方が利用できます';
}

指定したすべての要素が設定されていて、値がnullでない場合にのみtrueになります。

フォームデータやAPIレスポンスなど、複数の項目を一度にチェックしたい場合に便利です。

多次元配列の存在をチェックする方法

PHPでは、階層が深い多次元配列でもisset()を利用できます。

ネストした配列をisset()で確認する

例えば次のような配列があるとします。

$user = [
    'profile' => [
        'name' => 'Taro'
    ]
];

profileの中にnameが存在するかを確認する場合は、次のように書けます。

if (isset($user['profile']['name'])) {
    echo $user['profile']['name'];
}

途中の階層が存在しない場合でも、isset()を使えば安全に判定できます。

if (isset($user['address']['city'])) {
    echo $user['address']['city'];
}

多次元配列を扱うときに、存在しないキーを直接読み取らないための基本的な方法として覚えておくとよいでしょう。

null合体演算子で存在チェックと初期値設定を行う

配列要素が存在するか確認するだけでなく、「存在しなければ別の値を使用したい」という場合には、null合体演算子??が便利です。

null合体演算子の基本的な使い方

例えば、ユーザー名が存在しない場合にGuestを使用する場合は次のように書きます。

$user = [
    'name' => 'Taro'
];

$name = $user['name'] ?? 'Guest';

echo $name;

結果は次のとおりです。

Taro

一方、nameが存在しない場合は右側の値が使用されます。

$user = [];

$name = $user['name'] ?? 'Guest';

echo $name;

結果は次のようになります。

Guest

値がnullの場合も右側が使われる

null合体演算子で重要なのは、キーが存在していても値がnullであれば右側の値が使われることです。

$user = [
    'name' => null
];

$name = $user['name'] ?? 'Guest';

echo $name;

この場合も結果は、

Guest

となります。

したがって、??はキーの存在そのものを確認するためのものではなく、isset()と同じように「値が設定されていてnullではないか」を基準として処理します。

empty()で配列要素が空かチェックする

PHPにはempty()という構文もあります。

ただし、empty()は単純な存在チェックとは意味が異なるため注意が必要です。

empty()の基本的な使い方

例えば次のように使用します。

$user = [
    'name' => ''
];

if (empty($user['name'])) {
    echo 'nameが空です';
}

値が空文字列であるため、empty()trueになります。

0やfalseも空として扱われる

empty()では、次のような値が空と判断されます。

''
'0'
0
0.0
false
null
[]

例えば次のコードを見てみましょう。

$array = [
    'count' => 0
];

if (empty($array['count'])) {
    echo '空です';
}

countというキーは存在しています。
しかし値が0なので、empty()trueになります。

そのため、「配列にキーが存在するか」を調べたいだけの場合には、empty()ではなくisset()array_key_exists()を利用するほうが適切です。

isset()とempty()の違い

isset()empty()は目的が異なります。

例えば次の配列を考えます。

$array = [
    'count' => 0
];

この場合、

var_dump(isset($array['count']));
var_dump(empty($array['count']));

は、どちらもtrueになります。

bool(true)
bool(true)

一見すると矛盾しているようですが、確認している内容が違います。

isset()が確認していること

isset()は、

「配列要素が設定されていて、値がnullではないか」

を確認します。

0nullではないため、isset()trueになります。

empty()が確認していること

一方のempty()は、

「値がPHPにおいて空とみなされるか」

を確認します。

0は空とみなされる値なので、empty()trueになります。

フォームや数値データでは0が正常な値として使われることも多いため、empty()だけで存在を判定しないよう注意しましょう。

PHP 8以降では未定義の配列キーに注意する

PHP 8.0以降では、存在しない配列キーを通常の読み取りとして参照すると、Undefined array keyというE_WARNINGレベルの警告が発生します。

例えば、次のようなコードです。

$user = [
    'name' => 'Taro'
];

echo $user['email'];

emailというキーが存在しないため、警告の原因になります。

そのため、配列要素を取得するときは事前に、

if (isset($user['email'])) {
    echo $user['email'];
}

とチェックするか、

$email = $user['email'] ?? '';

のようにnull合体演算子を使用すると安全です。

配列のキーと値を混同しないことが重要

PHPで配列の存在チェックを行う際は、「キー」と「値」のどちらを調べたいのかを明確にすることが重要です。

例えば、次の配列があります。

$array = [
    'fruit' => 'apple'
];

キーを調べる場合

fruitというキーが存在するかを確認する場合は、

array_key_exists('fruit', $array);

を使用します。

値を調べる場合

appleという値が存在するかを確認する場合は、

in_array('apple', $array, true);

を使用します。

つまり、

array_key_exists()

はキーの存在を確認する方法で、

in_array()

は値の存在を確認する方法です。

ここを混同すると、意図した判定にならない可能性があります。

PHPの配列存在チェックを目的別に使い分ける

配列の存在を確認する方法は、目的によって使い分けるのが基本です。

キーが存在し値がnullではないことを確認したい

if (isset($array['key'])) {
    // 処理
}

null以外の値が設定されていることを確認したい場合に適しています。

nullを含めてキーの存在を確認したい

if (array_key_exists('key', $array)) {
    // 処理
}

キーそのものの存在が重要な場合に使用します。

特定の値が含まれているか確認したい

if (in_array($value, $array, true)) {
    // 処理
}

配列内の値を検索したい場合に適しています。

値が存在するキーも取得したい

$key = array_search($value, $array, true);

if ($key !== false) {
    // $keyを利用する
}

値の存在と、その値が格納されているキーの両方を知りたい場合に利用できます。

存在しない場合に初期値を設定したい

$value = $array['key'] ?? 'default';

存在確認だけのためにif文を書く必要がなく、コードを簡潔にできます。

PHPの配列存在チェックでよくある間違い

PHPで配列を扱う際には、存在チェックの方法を間違えることで思わぬ不具合が発生する場合があります。

nullの要素をisset()だけで判断する

例えば次の配列があります。

$array = [
    'name' => null
];

この場合、

isset($array['name']);

falseになります。

しかし、キー自体は存在しています。

キーの存在そのものを調べたい場合には、

array_key_exists('name', $array);

を使用します。

in_array()で型を意識しない

配列内の値を検索するとき、型まで区別する必要がある場合があります。

その場合は、

in_array($value, $array, true);

のように、第3引数にtrueを指定します。

特に数値と数値文字列などを区別したい場合には重要です。

array_search()の結果をそのままif文で判定する

次のような書き方には注意が必要です。

if (array_search('apple', $array, true)) {
    // 処理
}

値がインデックス0に存在すると、戻り値として0が返されるため、条件式ではfalseとして扱われます。

正しくは、

$key = array_search('apple', $array, true);

if ($key !== false) {
    // 処理
}

とします。

PHPで配列の存在をチェックするときのまとめ

PHPで配列の要素の存在をチェックする方法は、一つではありません。
「キーを調べたいのか」「値を調べたいのか」「nullを存在する値として扱うのか」によって適切な方法が変わります。

基本的な使い分けは次のとおりです。

// キーが存在し、値がnullではない
isset($array['key']);

// nullを含めてキーそのものが存在する
array_key_exists('key', $array);

// 特定の値が存在する
in_array($value, $array, true);

// 値が存在するキーを取得する
array_search($value, $array, true);

// 存在しない、またはnullなら初期値を使用する
$value = $array['key'] ?? 'default';

特に覚えておきたいのは、isset()array_key_exists()の違いです。
isset()は配列要素の値がnullの場合にはfalseになりますが、array_key_exists()はキーが存在していれば値がnullでもtrueになります。

また、配列の「値」を調べる場合にはin_array()を使用し、値が存在するキーまで取得したい場合にはarray_search()を利用します。
PHP 8.0以降では存在しない配列キーを直接読み取ると警告が発生するため、isset()やnull合体演算子??を活用して安全に配列を扱うことが重要です。

以上、PHPで配列の要素の存在をチェックする方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次