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となるので、想定と違う結果が返ってくる恐れがあります。
これを避けるために、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;
第三引数にtrueを入れることで、厳密な比較による検索可
こちらもin_array()に同じく、第三引数にtrueを設定することで厳密な比較による検索が可能です。
曖昧な比較(true無)
$aryHoge = ['1', '10', '100']; $key = array_search(100, $aryHoge); if(!is_bool($key)){ echo '100のキーは'.$key; }else{ echo '100のキーは見つかりません'; }
厳密な比較(true有)
$aryHoge = ['1', '10', '100']; $key = array_search(100, $aryHoge, true); if(!is_bool($key)){ echo '100のキーは'.$key; }else{ echo '100のキーは見つかりません'; }
見つからない場合はfalseを返すので、変数がtrue/false型かを調べるis_bool関数を使用して判定しています。
同じ値が複数ある場合は、最初のキーを取得する
同じ値が複数配列に含まれていた場合は、最初に見つかった値のキーを取得するので注意です。
$aryHoge = ['Japan', 'USA', 'China', 'Japan']; $key = array_search('Japan', $aryHoge); echo 'Japanのキーは'.$key;
↑の例では、値「Japan」が入ったキーは0と3ですが、先にヒットする0を取得します。
array_search()は連想配列も取得化
例では連番の配列を紹介しましたが、キーに文字列が含まれる連想配列も問題なく取得できます。
$aryHoge = ['Japan' => '日本', 'USA' => 'アメリカ', 'China' => '中国']; $key = array_search('中国', $aryHoge); echo '中国のキーは'.$key;
array_search()で多次元の連想配列を取得する方法
配列の値が連想配列になっている、多次元配列においても、array_searchを活用できます。
カラムの値だけ取得できるarray_column()という関数を組み合わせて、多次元連想配列のキーを取得できます。
$aryHoge = [ ['id' => 'Japan', 'name' => '日本'], ['id' => 'USA', 'name' => 'アメリカ'], ['id' => 'China', 'name' => '中国'] ]; $key = array_search('USA', array_column($aryHoge, 'id')); echo 'USAのキーは'.$key;
【注意】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はありません'; }
これを回避するには、返却を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はありません'; }
検索した配列のキーを使用して削除する
array_searchで取得した配列のキーを使用して、配列の削除が出来ます。
$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);
(
[0] => Japan
[2] => China
)
PHPの配列の検索方法について、いくつかのサンプルを交えて解説しました。
in_array()とarray_search()、状況に応じて使い分けていきましょう。
以上、PHPで配列の値を検索するin_array、array_searchの使い方、でした。
ディスカッション
コメント一覧
まだ、コメントがありません