PHP array_search でキーを取得する
array_search() は、配列内で指定した値を検索し、見つかった場合はそのキーを返す関数です。in_array() が真偽値を返すのに対し、array_search() は位置(キー)を返します。
$fruits = ['apple', 'banana', 'orange'];
$key = array_search('banana', $fruits);
echo $key; // 1
$key = array_search('grape', $fruits);
var_dump($key); // false見つからなかった場合は false を返します。この戻り値の扱いには注意が必要です。
戻り値の判定
キーが 0 の場合と見つからなかった場合(false)を区別するには、厳密な比較 === を使う必要があります。
$fruits = ['apple', 'banana', 'orange'];
$key = array_search('apple', $fruits);
// 危険な判定
if ($key) {
echo '見つかった';
} else {
echo '見つからない'; // 0 も false 扱いされる
}
// 正しい判定
if ($key !== false) {
echo '見つかった';
}この挙動は strpos() など他の PHP 関数でも同様で、PHP でよくあるハマりポイントです。
厳密な比較モード
in_array() と同様に、第 3 引数に true を指定すると厳密な比較になります。型が異なる値を誤って見つけてしまう問題を防げます。
$values = [0, '0', false, null];
// 緩やかな比較
var_dump(array_search('', $values)); // 0(0 == '' が true)
var_dump(array_search(false, $values)); // 0(0 == false が true)
// 厳密な比較
var_dump(array_search('', $values, true)); // false
var_dump(array_search(0, $values, true)); // 0連想配列での使用
連想配列でも同じように使えます。戻り値は文字列キーになります。
$scores = ['math' => 80, 'english' => 90, 'science' => 85];
$subject = array_search(90, $scores);
echo $subject; // english複数の一致がある場合
最初に見つかったキーだけが返されます。すべての一致するキーを取得したい場合は array_keys() の第 2 引数を使います。
$values = ['a', 'b', 'a', 'c', 'a'];
// 最初の一致のみ
echo array_search('a', $values); // 0
// すべての一致
$keys = array_keys($values, 'a');
print_r($keys); // [0, 2, 4]