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]