【PHP】配列のキーを取得する方法|array_keys・array_searchの使い分け

PHPで配列のキーを取得するには array_keys() を使います。全キーの取得や、特定の値に一致するキーの抽出ができます。この記事では基本に加え、1つだけ取りたい場合キーの存在確認との使い分けまで解説します。

この記事の結論:全キーは array_keys($arr)、特定の値に一致するキーは array_keys($arr, 値)最初の1つだけなら array_search()先頭・末尾のキーarray_key_first() / array_key_last()キーがあるかarray_key_exists() を使います。
スポンサーリンク

すべてのキーを取得する

array_keysで全キー
<?php
$arr = ["name" => "John", "age" => 30, "gender" => "male"];

print_r(array_keys($arr));
// ["name", "age", "gender"]

数値キーの配列でも同様に取得できます。キーを取り出して foreach で回したり、IDの一覧を作るのに便利です。

特定の値に一致するキーを取得する

第2引数に値を渡すと、その値を持つすべてのキーを配列で返します。

値に一致するキー
<?php
$arr = ["name" => "John", "age" => 30, "age_group" => 30];

print_r(array_keys($arr, 30));
// ["age", "age_group"]
値の一致は既定で「緩い比較(==)」です。array_keys($arr, 30) は数値の 30 だけでなく文字列の "30" にも一致します。型まで区別したいなら第3引数に true(厳密比較)を指定してください。
厳密比較で値一致
<?php
$arr = ["x" => 30, "y" => "30"];

print_r(array_keys($arr, 30));        // ["x", "y"](緩い比較)
print_r(array_keys($arr, 30, true));  // ["x"](厳密比較)

最初の1つだけ取得する(array_search)

「値に一致する最初のキー1つ」が欲しいなら array_search() です。見つからなければ false を返します。

array_searchで最初のキー
<?php
$arr = ["a" => "apple", "b" => "banana"];

$key = array_search("banana", $arr, true); // 第3引数 true で厳密比較
var_dump($key); // "b"

if ($key !== false) { // 必ず !== false で判定
    echo "見つかったキー: $key";
}
array_search() の戻り値は必ず !== false で判定してください。キーが 0"" のとき、if ($key) だと見つかっても偽と誤判定されます。

先頭・末尾のキーを取得する(PHP 7.3+)

「最初のキー」「最後のキー」だけが欲しいなら、array_key_first() / array_key_last() が簡潔です。

array_key_first / array_key_last
<?php
$arr = ["x" => 1, "y" => 2, "z" => 3];

echo array_key_first($arr); // "x"
echo array_key_last($arr);  // "z"
先頭・末尾の要素(値)の取得は配列の最初と最後の要素を取得する方法で解説しています。

キーが存在するか確認する

「キーを取得」ではなく「特定のキーがあるか」を知りたいなら、array_key_exists() または isset() を使います。

キーの存在確認
<?php
$arr = ["name" => "John", "nickname" => null];

var_dump(array_key_exists("name", $arr));     // true
var_dump(isset($arr["nickname"]));            // false(値がnullだとfalse)
var_dump(array_key_exists("nickname", $arr)); // true(nullでもキーは存在)
isset() は値が null のキーを false と判定します。「キーが存在するか」だけを確実に見たいなら array_key_exists() を使ってください。詳しくは配列のキーが存在するか確認する方法を参照。

よくある質問(FAQ)

Qarray_keysで値に一致するキーを取ると、型が違うものも混ざります。
A既定が緩い比較(==)のためです。array_keys($arr, 30)"30" にも一致します。型まで区別するには第3引数に true を指定してください。
Q値に一致するキーを1つだけ取りたいです。
Aarray_search($値, $arr, true) を使います。最初に一致したキーを返し、見つからなければ false です。戻り値は !== false で判定してください。
Qarray_key_existsとissetの違いは?
Aisset() は値が null のキーを false と判定します。array_key_exists()値がnullでもキーが存在すればtrueです。キーの有無を確実に見るなら array_key_exists を使ってください。
Q最初のキーだけ欲しいです。
APHP 7.3以降なら array_key_first($arr) が簡潔です。それ以前は array_keys($arr)[0] でも取得できます。

まとめ

PHPで配列のキーを取得するポイントを整理します。

  • 全キーは array_keys($arr)
  • 値に一致するキーは array_keys($arr, 値, true)strictで型も一致
  • 最初の1つは array_search()!== false で判定)
  • 先頭・末尾のキーは array_key_first() / array_key_last()
  • キーの有無は array_key_exists()(nullでもtrue)

関連として、配列の最初と最後の要素を取得する方法配列のキーが存在するか確認する方法array_valuesで値を取得する方法もあわせて読むと、PHPの配列操作に強くなれます。