PHPで配列から特定の要素の存在確認する方法について紹介したいと思います。
PHPではこの機能を有する関数が複数存在しており、ネットで調べてもどれも似たような特徴を持っていることくらいしかわからず、いったいどれを使っていいのか迷われているのではないでしょうか。
実際にPHPにおいて、配列への特定要素の存在確認できる関数群はそれぞれ特徴が微妙に異なっています。そのため中途半端な知識で使ってしまうと思わぬバグを生むことになります。
それぞれの特徴をしっかり学び、適切な方法でプログラミングしていきましょう。
目次
in_array関数
通常の配列の場合
通常の配列で特定の要素の存在確認を行う方法の代表例としてin_array関数があります。第一引数に検索したい値、第二引数には検索対象の配列変数、第三引数にはtrueを入れて下さい。後述しますが第三引数のtrueは実は省略できます。しかし省略すると思わぬ事故が起きるので第三引数のtrueは必ず入れましょう。
1 2 3 4 |
$member = array("鈴木", "佐藤", "山田", "渡辺", "池田", "田中"); print var_dump(in_array("山田", $member, true)); print var_dump(in_array("小林", $member, true)); |
出力結果は以下の通りとなります。$memberに存在する「山田」にはtrueが、存在しない「小林」にはfalseが返ってきていることがわかるかと思います。
1 2 |
bool(true) bool(false) |
連想配列の場合
連想配列でin_array関数を使った例です。
1 2 3 4 |
$member = array("鈴木"=>42, "佐藤"=>38, "山田"=>32, "渡辺"=>26, "池田"=>52, "田中"=>45); print var_dump(in_array(26, $member)); print var_dump(in_array(55, $member)); |
出力結果は以下のとおりです。
1 2 |
bool(true) bool(false) |
ちょっとややこしいですが、連想配列の場合は第三引数にtrueを入れても入れなくても結果は変わりません。上記は第三引数を省略した例になっています。
使用にあたっての注意事項
上で少し触れましたが、通常の配列で第三引数のtrueは省略してもエラーとならず結果を出力します。しかし、省略すると思わぬ事故が起きるので必ず入れましょう。
以下の例では、数値の配列$numberに対し「小林」というデータがあるかどうかを確認するためのプログラムになっています。第三引数は省略されています。
1 2 3 |
$number = [0, 1, 2, 3, 4, 5]; print var_dump(in_array("小林", $number)); |
本来であれば小林なんてデータは存在しないのでfalseが出力されなければなりません。ところが結果は以下のようにtrueが返ってきてしまうのです。
1 |
bool(true) |
この理由は、文字列と数値を比較する際に文字列は自動で型変換され0になってしまうからです。0という値は$number内に存在しているのでtrueが返ってきてしまうわけですね。
以下のように第三引数にtrueを入れることで型同士も比較してくれるようになります。
1 2 3 |
print var_dump(in_array("小林", $number, ture)); //出力 //bool(false) |
次に連想配列での注意事項です。
連想配列ではあくまで値の存在確認であって、キーの存在確認ではないということです。以下のように「山田」を検索したつもりでもヒットしません。
1 2 3 4 |
$member = array("鈴木"=>42, "佐藤"=>38, "山田"=>32, "渡辺"=>26, "池田"=>52, "田中"=>45); print var_dump(in_array("山田", $member)); //出力 //bool(false) |
困ったことに、連想配列では通常の配列のような暗黙の型変換(=0)が起きず、値に「山田」が存在しているかをチェックしてくれます。もちろん第三引数にtureを入れても結果は変わらず問題ありません。
array_key_exist関数
通常の配列の場合
通常の配列ではarray_key_exist関数は使用できないので省略します。
連想配列の場合
array_key_exist関数は連想配列のキーの存在有無で効果を発揮します。
1 2 3 4 |
$member = array("鈴木"=>42, "佐藤"=>38, "山田"=>32, "渡辺"=>26, "池田"=>52, "田中"=>45); print var_dump(array_key_exists('山田', $member)); print var_dump(array_key_exists('小林', $member)); |
出力は以下の通り。
1 2 |
bool(true) bool(false) |
使用にあたっての注意事項
注意事項は、通常の配列では使用できないものの、エラーが出ずに結果が出力してしまう点です。
以下のように通常の配列に使ってみましょう。
1 2 3 4 |
$member = array("鈴木", "佐藤", "山田", "渡辺", "池田", "田中"); print var_dump(array_key_exists('山田', $member)); print var_dump(array_key_exists('小林', $member)); |
結果は通常の配列にキーそのものがないのですべてfalseが返ってきます。値の検索のつもりで使ってしまうとすべてfalseが返ってきてしまうので注意してください。
1 2 |
bool(false) bool(false) |
array_search関数
通常の配列の場合
次はarray_search関数です。以下の例を見てみましょう。
1 2 3 4 |
$member = array("鈴木", "佐藤", "山田", "渡辺", "池田", "田中"); print var_dump(array_search('山田', $member)); print var_dump(array_search('小林', $member)); |
出力結果は以下の通り。存在しない場合はfalseを返します。一方で存在する場合はtrueではなく要素番号を返します。array_search関数は単純な存在の有無ではなく要素番号の取得に使えます。
1 2 |
int(2) bool(false) |
連想配列の場合
次に連想配列の例です。array_search関数は値の検索となります。
1 2 3 4 |
$member = array("鈴木"=>42, "佐藤"=>38, "山田"=>32, "渡辺"=>26, "池田"=>52, "田中"=>45); print var_dump(array_search(32, $member)); print var_dump(array_search(99, $member)); |
以下が出力結果です。存在しない場合はfalseを返します。存在する場合はtrueではなくキーを返します。※var_dump関数で出力すると先頭にstring(6)が現れますが、返ってきているのは「山田」のみです。
1 2 |
string(6) "山田" bool(false) |
使用にあたっての注意事項
注意点は連想配列でキーの検索に使ってしまうことです。エラーを出さないのであたかも正常に動作しているかのように見えますが、すべてfalseを出力してしまいます。
1 2 3 4 |
$member = array("鈴木"=>42, "佐藤"=>38, "山田"=>32, "渡辺"=>26, "池田"=>52, "田中"=>45); print var_dump(array_search("山田", $member)); //出力 //bool(false) |
isset関数
通常の配列の場合
通常の配列ではisset関数の使いどころはあまりありません。
あえて言えば要素数を超えた場合にfalseを返すくらいでしょうか。ただ、こんな使い方はあまり登場することはないと思うので、通常配列ではほぼ使い道がないと思って差し支えないかと思います。
1 2 3 4 5 6 |
$member = array("鈴木", "佐藤", "山田", "渡辺", "池田", "田中"); print var_dump(isset($member[1])); //bool(true) print var_dump(isset($member[6])); //bool(false) |
連想配列の場合
連想配列ではキーの検索に使うことができます。
1 2 3 4 |
$member = array("鈴木"=>42, "佐藤"=>38, "山田"=>32, "渡辺"=>26, "池田"=>52, "田中"=>45); print var_dump(isset($member['山田'])); print var_dump(isset($member['小林'])); |
出力結果は以下の通りです。
1 2 |
bool(true) bool(false) |
使用にあたっての注意事項
注意事項は特にありません。
まとめ
いかがでしょうか。
今回はPHPで配列から特定の要素の存在確認する方法について紹介しました。PHPでは複数の関数が用意されているため、どれを使ってよいのか迷ってしまいます。適切な関数を選ぶためには、それぞれの関数の特徴と使用上の注意点をしっかり押さえることが重要です。
本記事を読んでいただいたことで各関数の特徴をしっかり学んでいただけたと思います。