第5章 組み込み関数 / 第4回 模擬試験
PHPの`array_search()`関数と`in_array()`関数に関する次の記述のうち、正しいものはどれか。
`array_search()`は見つかった要素のキーを返し、`in_array()`は見つかったかどうかを`bool`で返す。
正解
`array_search()`と`in_array()`は完全に同じ戻り値の型を返す。
`array_search()`は要素が見つからない場合、必ず`0`を返す。
`in_array()`は配列の中身をソートしてから検索する関数である。
解説
`array_search($needle, $haystack)`は、見つかった要素の「キー」(配列のインデックスやキー名)を返す関数です。一方`in_array($needle, $haystack)`は、要素が存在するかどうかを`true`/`false`の`bool`値で返す関数です。
他の選択肢が誤りである理由は次の通りです。
・`array_search()`はキー(`int`または`string`、見つからない場合は`false`)を返し、`in_array()`は`bool`を返すため、戻り値の型は異なります。
・`array_search()`は要素が見つからない場合、`0`ではなく`false`を返します。数値キー`0`の位置で見つかった場合の戻り値`0`と、見つからない場合の`false`を`==`で比較すると、PHPでは`0 == false`が`true`になってしまうため、必ず`===`で比較する必要があります。
・`in_array()`は配列を先頭から順に走査する単純な検索を行うだけで、事前にソートを行うことはありません。
例:
```
$fruits = ['apple', 'banana', 'cherry'];
var_dump(array_search('banana', $fruits)); // int(1)
var_dump(array_search('grape', $fruits)); // bool(false)
var_dump(in_array('banana', $fruits)); // bool(true)
// ありがちなバグ
if (array_search('grape', $fruits) == false) { /* 常にtrueになってしまう例 */ }
if (array_search('grape', $fruits) === false) { /* 正しい書き方 */ }
```
(参照: 独習PHP 第4版 第5章 組み込み関数 5.3.8〜5.3.9節 array_search/in_array関数 p.201〜202)