PHPの配列に値が含まれるか検索して確認する2つの方法!

PHP

PHPで配列に値が含まれるか検索して、確認する方法について書いています。
下記の関数を使って、特定の値が配列に含まれているかを確認します。

・in_array
・array_search

記載しているサンプルコードはPHPのバージョン8.1.8で、動作検証しています。

in_array関数で含むか検索する

in_array関数を使うことで、配列に含まれるか検索することが可能です。
公式ドキュメントはこちらです。

in_array関数に対して、検索したい値と配列を渡して確認します。
例えば、このように使います。

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

if (in_array('grape', $fruits)) {
    echo "grapeは存在します";
}

$fruits配列を5つの文字列の要素で作成しています。

その次の処理で、in_array関数を使っています。
in_array関数に渡している内容は下記になります。

・第1引数:存在するか検索したい値
・第2引数:検索したい配列

第2引数の配列から、第1引数に指定した値を探します。
今回の場合だと、$fruits配列から「grape」を探します。

見つかった場合はtrueが返ってきます。
見つからなかった場合はfalseになります。

今回の場合だと、$fruits配列に「grape」を含んでいるので、trueになります。
echoで「grapeは存在します」が出力されて処理が終了します。

in_array関数に第3引数を設定する

in_array関数には、第3引数に論理値を渡すことができます。
デフォルトではfalseになっていて、必須の引数ではありません。

trueを渡すと、厳密な型比較を行なって、結果を返してくれます。
例えば、指定していない場合は、下記のような場合でもtrueが返ってきます。

$numbers = [11, 22, 33];
if (in_array('22', $numbers)) {
    echo "22が含まれます。";
} else {
    echo "22が含まれません。";
}

$numbers配列を3つの数値で作成しています。
次の行でin_arrayを使って、文字列の22があるか確認しています。

この結果はtrueが返ってきて、「22が含まれます。」が出力されます。
型まで参照して比較されていないため、暗黙的に変換されて、存在することになります。

第3引数をつけることで、型まで見てくれるので、意図しない挙動を防げます。

$numbers = [11, 22, 33];
if (in_array('22', $numbers, true)) {
    echo "22が含まれます。";
} else {
    echo "22が含まれません。";
}

このように第3引数を指定すると、型まで厳密に確認するので、falseが返されます。
結果「22が含まれません。」を出力して、処理が終了します。

配列の値と検索する値で、違う型の値をあつかう場合には、trueをつけておいた方が良さそうです。

in_array関数の引数と返り値まとめ

in_array関数の引数と返り値をまとめると、下記のようになります。

第1引数

必須の引数です。
第2引数に渡した配列から探したい値を指定します。

第2引数

必須の引数です。
含まれるか検索する配列を渡します。

第3引数

第3引数はデフォルトfalseで、必須ではない引数です。
trueを指定すると、型まで厳密に確認してくれるようになります。

返り値

第1引数の値が、第2引数に含まれる場合にtrueになります。
含まれない場合は、falseが返ってきます。

array_search関数で含むか検索する

array_search関数を使うことでも、配列に値を含むか検索することができます。
array_search関数も、検索したい値と配列を渡して確認します。
公式ドキュメントはこちらです。

$fruits = ['apple', 'orange', 'grape', 'banana', 'lemon'];
$result = array_search('banana', $fruits);
if ($result !== false) {
    echo "bananaは存在します";
}

$fruits配列を5つの文字列の要素で作成しています。

その次の処理で、array_search関数を使っています。
array_search関数に渡している内容は下記です。

・第1引数:存在するか検索したい値
・第2引数:検索したい配列

in_array関数と同じように引数を渡します。
今回の場合だと、$fruits配列に「banana」が含まれているかを確認します。

$result変数に探した結果が返ってきます、返り値についてはin_array関数と違います。
見つかった場合は配列のキーが返ってきて、見つからなかった場合にfalseが返ってきます。

今回の場合は存在しているので、配列のキーの「3」が返ってきて、$result変数に代入されます。
falseではないので、if文の中を通って「bananaは存在します」を出力して、処理が終わります。

判定に気をつけたい

array_search関数を使う場合には、判定に気をつけたいところです。
配列のキーが返ってくるので、1番目の要素に含まれていたときには0が返ってきます。

$fruits = ['apple', 'orange', 'grape'];
if (array_search('apple', $fruits)) {
    echo "bananaは存在します";
}

上記の場合、最初の要素に含んでいるので、0が返ってきます。
if文に結果を直接指定してしまうと、falseになって、if文の中を通りません。

判定するときには、falseなのかを確認するようにしましょう。

if (array_search('apple', $fruits) !== false) {
    echo "bananaは存在します";
}

array_search関数の第3引数を設定する

第3引数を指定すると、in_array関数と同じように型の確認まで行なってくれます。
例えば、第3引数を指定していない場合です。

$numbers = [11, 22, 33];
$result = array_search('22', $numbers);
echo $result; // 1

数値配列を文字列の「22」で検索しています。
型まで確認せずに、暗黙的に変換されて、要素のある配列のキーの「1」が返ってきます。

下記では、第3引数にtrueを設定しています。

$numbers = [11, 22, 33];
$result = array_search('22', $numbers, true);
echo $result === false ? 'falseです' : 'trueです'; // falseです

型まで確認するので、見つからないことになり、falseが返ってきます。
結果「falseです」が出力されて、処理が終了します。

array_search関数の引数と返り値まとめ

array_search関数の引数と返り値をまとめると、下記のようになります。

第1引数

必須の引数です。
第2引数に渡した配列から探したい値を指定します。

第2引数

必須の引数です。
含まれるか検索する配列を渡します。

第3引数

第3引数はデフォルトfalseで、必須ではない引数です。
trueを指定すると、型まで厳密に確認してくれるようになります。

返り値

第1引数の値が、第2引数に含まれる場合に配列のキーを返します。
含まれない場合は、falseが返ってきます。

in_array関数との違いは?どちらを使う?

先ほども少し書きましたが、in_array関数と違うのは、返り値として配列のキーが返ってくるところです。

単純に含むか確認するような処理の場合にはin_array関数を使う方がいいでしょう。
配列のキーが必要な場合に、array_search関数を使うと良さそうです。

コメント

タイトルとURLをコピーしました