PHPで配列の値を検索するin_array、array_searchの使い方

PHPの配列から値を検索し、判定及び値のキーを取得できる2つの関数を、サンプルコードを交えて解説します。

in_array() 配列から値が存在するか調べる

PHPのin_arrayは、調べたい値が配列内に存在するかどうかを検索し、存在したらtrue、なければfalseを返す関数です。

第一引数に調べたい値を、第二引数に対象の配列を設定します。

サンプルコード
$aryHoge = ['Japan', 'USA', 'China'];

if(in_array('USA', $aryHoge)){
    echo '配列内に値がありました。';
}else{
    echo '配列内に値がありません。';
}
配列内に値がありました。

型の一致も検索条件に含める場合、第三引数にtrueを入れる

in_arrayのデフォルトの検索は「曖昧な比較」で行われます。

曖昧な比較は文字型と数値型を区別しないため「10 == ’10’」がtrueになったり、「0 == ‘hoge’」もtrueとなるので、想定と違う結果が返ってくる恐れがあります。

PHPの「==」で文字列と数値を比較する時の注意点
PHPで文字列と数値で値を比較する時の仕様と注意点をまとめました。バグやセキュリティホールの原因ともなり得るPHPの緩やかな比較「==」の仕様を理解しておきましょう。

これを避けるために、in_arrayの第三引数に「true」を入れましょう。
すると、型も一致した場合のみ検索に引っかかる厳密な比較となります。

曖昧な比較(true無)

サンプルコード
$aryHoge = ['1', '10', '100'];

if(in_array(10, $aryHoge)){
    echo '配列内に値がありました。';
}else{
    echo '配列内に値がありません。';
}
配列内に値がありました。

厳密な比較(true有)

サンプルコード
$aryHoge = ['1', '10', '100'];

if(in_array(10, $aryHoge, true)){
    echo '配列内に値がありました。';
}else{
    echo '配列内に値がありません。';
}
配列内に値がありません。

array_search() 配列から値に対応したキーを取得する

配列内に値があるかどうかだけを知りたいならin_array()で十分です。

ただ、検索した値のキーを取得したい場合は、検索した値のキーを取得するarray_search()が利用できます。

in_array()に同じく、第一引数に調べたい値を、第二引数に対象の配列を設定してください。

値が見つかればその値のキーを、見つからない場合はfalseを返します。

サンプルコード
$aryHoge = ['Japan', 'USA', 'China'];

$key = array_search('USA', $aryHoge);

echo 'USAのキーは'.$key;
USAのキーは1

第三引数にtrueを入れることで、厳密な比較による検索可

こちらもin_array()に同じく、第三引数にtrueを設定することで厳密な比較による検索が可能です。

曖昧な比較(true無)

サンプルコード
$aryHoge = ['1', '10', '100'];

$key = array_search(100, $aryHoge);

if(!is_bool($key)){
    echo '100のキーは'.$key;
}else{
    echo '100のキーは見つかりません';
}
100のキーは2

厳密な比較(true有)

サンプルコード
$aryHoge = ['1', '10', '100'];

$key = array_search(100, $aryHoge, true);

if(!is_bool($key)){
    echo '100のキーは'.$key;
}else{
    echo '100のキーは見つかりません';
}
100のキーは見つかりません

見つからない場合はfalseを返すので、変数がtrue/false型かを調べるis_bool関数を使用して判定しています。

同じ値が複数ある場合は、最初のキーを取得する

同じ値が複数配列に含まれていた場合は、最初に見つかった値のキーを取得するので注意です。

サンプルコード
$aryHoge = ['Japan', 'USA', 'China', 'Japan'];

$key = array_search('Japan', $aryHoge);

echo 'Japanのキーは'.$key;
Japanのキーは0

↑の例では、値「Japan」が入ったキーは0と3ですが、先にヒットする0を取得します。

array_search()は連想配列も取得化

例では連番の配列を紹介しましたが、キーに文字列が含まれる連想配列も問題なく取得できます。

サンプルコード
$aryHoge = ['Japan' => '日本', 'USA' => 'アメリカ', 'China' => '中国'];

$key = array_search('中国', $aryHoge);

echo '中国のキーは'.$key;
中国のキーはChina

【注意】ifの判定でarray_searchを使用するのは危険

繰り返しますが、array_searchは値が見つかればその値のキーを、見つからない場合はfalseを返す関数です。

つまりキーが連番となる配列で、先頭の値のキーを調べようとした時は「0」を返します。
「0」はifの判定では偽となるため、if文でarray_searchを使用すると、「値があるのにifの判定を通らない」可能性があります。

サンプルコード
$aryHoge = ['Japan', 'USA', 'China'];

//Japanは存在するが、キーが0なのでifの判定は偽になる
if(array_search('Japan', $aryHoge)){
    echo 'Japanはあります';
}else{
    echo 'Japanはありません';
}
Japanはありません

これを回避するには、返却をtrue/falseで返すin_array()を使用するか、返却がfalseかを調べられるis_boolで判定を行う必要があります。

サンプルコード
$aryHoge = ['Japan', 'USA', 'China'];

$key = array_search('Japan', $aryHoge);

if(!is_bool($key)){
    echo 'Japanのキーは'.$key;
}else{
    echo 'Japanはありません';
}
Japanのキーは0

検索した配列のキーを使用して削除する

array_searchで取得した配列のキーを使用して、配列の削除が出来ます。

参考 PHPの配列で特定のキー・値を削除する方法

サンプルコード
$aryHoge = ['Japan', 'USA', 'China'];

$key = array_search('USA', $aryHoge);

//array_searchでヒットした場合
if(!is_bool($key)){
    unset($aryHoge[$key]);
    
    //キーを連番に振り直したい場合↓
    //$aryHoge = array_values($aryHoge);
}

print_r($aryHoge);
Array
(
    [0] => Japan
    [2] => China
)

PHPの配列の検索方法について、いくつかのサンプルを交えて解説しました。

in_array()とarray_search()、状況に応じて使い分けていきましょう。

以上、PHPで配列の値を検索するin_array、array_searchの使い方、でした。

コメント

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