PHPで連想配列のキーを取得する場合、最も基本的な方法は array_keys() を使うことです。
ただし、キーをすべて取得したいのか、ループの中で1つずつ処理したいのか、最初または最後のキーだけを取得したいのかによって、適した書き方は変わります。
この記事では、PHPの連想配列におけるキーの取得方法について、基本から実務で注意したいポイントまで詳しく解説します。
連想配列のキーをすべて取得する方法
array_keys()を使う
連想配列のキーを一覧で取得したい場合は、array_keys() を使います。
$user = [
'name' => 'Taro',
'email' => 'taro@example.com',
'age' => 30,
];
$keys = array_keys($user);
print_r($keys);
出力結果は次のようになります。
Array
(
[0] => name
[1] => email
[2] => age
)
array_keys() は、配列のキーだけを取り出し、新しい配列として返します。
この例では、元の連想配列のキーである name、email、age が取得されています。
foreachでキーを1つずつ取得する方法
キーと値を同時に取得する
キーを1つずつ処理したい場合は、foreach を使う方法が便利です。
$user = [
'name' => 'Taro',
'email' => 'taro@example.com',
'age' => 30,
];
foreach ($user as $key => $value) {
echo $key . PHP_EOL;
}
出力結果は次のとおりです。
name
email
age
foreach ($array as $key => $value) と書くことで、配列のキーと値を同時に取得できます。
値も一緒に使いたい場合は、次のように書けます。
foreach ($user as $key => $value) {
echo "{$key}: {$value}" . PHP_EOL;
}
出力結果は次のようになります。
name: Taro
email: taro@example.com
age: 30
キーだけを処理する場合
値を使わず、キーだけを処理したい場合でも、foreach を使えます。
foreach ($user as $key => $_) {
echo $key . PHP_EOL;
}
$_ はPHPの特別な変数ではありませんが、「この値は使わない」という意図を示すために使われることがあります。
ただし、単にキーの一覧が欲しいだけであれば、array_keys() を使う方がシンプルです。
最初のキーを取得する方法
array_key_first()を使う
配列の最初のキーだけを取得したい場合は、array_key_first() を使います。
$user = [
'name' => 'Taro',
'email' => 'taro@example.com',
'age' => 30,
];
$firstKey = array_key_first($user);
echo $firstKey;
出力結果は次のとおりです。
name
array_key_first() は、配列の最初のキーを返します。
配列が空の場合は null が返ります。
$empty = [];
var_dump(array_key_first($empty));
出力結果は次のようになります。
NULL
array_key_first()の対応バージョン
array_key_first() は、PHP 7.3以降で使用できます。
PHP 7.2以前の環境では使えないため、古い環境を考慮する場合は次のように書くこともできます。
$keys = array_keys($array);
$firstKey = $keys[0] ?? null;
最後のキーを取得する方法
array_key_last()を使う
配列の最後のキーだけを取得したい場合は、array_key_last() を使います。
$user = [
'name' => 'Taro',
'email' => 'taro@example.com',
'age' => 30,
];
$lastKey = array_key_last($user);
echo $lastKey;
出力結果は次のとおりです。
age
array_key_last() は、配列の最後のキーを返します。
配列が空の場合は、array_key_first() と同じく null が返ります。
array_key_last()の対応バージョン
array_key_last() も、PHP 7.3以降で使用できます。
PHP 7.2以前の環境で最後のキーを取得したい場合は、次のように書けます。
$keys = array_keys($array);
$lastKey = $keys ? $keys[count($keys) - 1] : null;
特定の値を持つキーを取得する方法
array_keys()の第2引数を使う
array_keys() は、単にすべてのキーを取得するだけでなく、特定の値を持つキーだけを取得することもできます。
$roles = [
'taro' => 'admin',
'jiro' => 'editor',
'hanako' => 'admin',
];
$adminUsers = array_keys($roles, 'admin');
print_r($adminUsers);
出力結果は次のようになります。
Array
(
[0] => taro
[1] => hanako
)
この例では、値が admin の要素のキーだけを取得しています。
厳密比較でキーを取得する方法
array_keys()の第3引数を使う
array_keys() の第3引数に true を指定すると、型も含めて厳密に比較できます。
まず、通常の比較の例を見てみましょう。
$array = [
'a' => 1,
'b' => '1',
'c' => true,
];
$result = array_keys($array, 1);
print_r($result);
出力結果は次のようになる場合があります。
Array
(
[0] => a
[1] => b
[2] => c
)
第3引数を省略した場合、array_keys() は緩い比較を行います。
そのため、1、'1'、true が同じ値として扱われることがあります。
型まで厳密に比較したい場合は、次のように第3引数に true を指定します。
$result = array_keys($array, 1, true);
print_r($result);
出力結果は次のようになります。
Array
(
[0] => a
)
この場合、整数の 1 と完全に一致するキーだけが取得されます。
フォーム入力、CSV、JSON、データベースから取得した値などは、数値に見えても文字列として扱われることがあります。
意図しない一致を避けたい場合は、厳密比較を使うと安全です。
現在位置のキーを取得する方法
key()を使う
key() を使うと、配列の内部ポインタが現在指している要素のキーを取得できます。
$user = [
'name' => 'Taro',
'email' => 'taro@example.com',
'age' => 30,
];
echo key($user);
出力結果は次のとおりです。
name
配列を作成した直後であれば、通常は最初の要素のキーが返ります。
ただし、key() は内部ポインタの位置に依存します。
next($user);
echo key($user);
このように next() などで内部ポインタを進めると、返るキーも変わります。
そのため、通常のアプリケーションコードでは、最初のキーを取得したい場合は array_key_first()、ループ処理をしたい場合は foreach を使う方が分かりやすいです。
キーが存在するか確認する方法
array_key_exists()を使う
キーを取得するのではなく、「指定したキーが配列に存在するか」を確認したい場合は、array_key_exists() を使います。
$user = [
'name' => 'Taro',
'email' => 'taro@example.com',
'age' => 30,
];
if (array_key_exists('email', $user)) {
echo 'emailキーは存在します';
}
出力結果は次のとおりです。
emailキーは存在します
array_key_exists() は、指定したキーが配列に存在すれば true を返します。
array_key_exists()とisset()の違い
値がnullの場合の挙動が異なる
キーの存在確認では、isset() もよく使われます。
ただし、array_key_exists() と isset() では、値が null の場合の挙動が異なります。
$user = [
'name' => 'Taro',
'email' => null,
];
var_dump(isset($user['email']));
var_dump(array_key_exists('email', $user));
出力結果は次のようになります。
bool(false)
bool(true)
isset() は、キーが存在していても値が null の場合は false を返します。
一方、array_key_exists() は、値が null でもキーが存在していれば true を返します。
使い分けの目安
キーの存在そのものを確認したい場合は、array_key_exists() を使うのが安全です。
array_key_exists('email', $user);
キーが存在し、かつ値が null ではないことを確認したい場合は、isset() を使えます。
isset($user['email']);
違いをまとめると、次のようになります。
| 方法 | 値がnullの場合 |
|---|---|
isset($array['key']) | false |
array_key_exists('key', $array) | true |
キーを文字列として取得する方法
array_keys()とimplode()を組み合わせる
連想配列のキーをカンマ区切りの文字列にしたい場合は、array_keys() と implode() を組み合わせます。
$user = [
'name' => 'Taro',
'email' => 'taro@example.com',
'age' => 30,
];
$keyString = implode(', ', array_keys($user));
echo $keyString;
出力結果は次のとおりです。
name, email, age
ログ出力、CSVのヘッダー作成、SQLのカラム一覧作成などで使うことがあります。
ただし、SQL文にそのまま埋め込む場合は、カラム名の検証やエスケープ処理を行う必要があります。
多次元配列のキーを取得する方法
1つ目の要素からキーを取得する
ユーザー一覧のような多次元配列では、特定の要素に対して array_keys() を使うことでキーを取得できます。
$users = [
[
'id' => 1,
'name' => 'Taro',
'email' => 'taro@example.com',
],
[
'id' => 2,
'name' => 'Jiro',
'email' => 'jiro@example.com',
],
];
$keys = array_keys($users[0]);
print_r($keys);
出力結果は次のようになります。
Array
(
[0] => id
[1] => name
[2] => email
)
この例では、1件目のユーザー情報から id、name、email というキーを取得しています。
空配列を考慮する場合
実務では、$users[0] が存在しない可能性もあります。
その場合は、次のように書くと安全です。
$keys = array_keys($users[0] ?? []);
$users[0] が存在しない場合でも、空配列に対して array_keys() を実行するため、エラーを避けやすくなります。
多次元配列の各要素のキーを取得する方法
foreachとarray_keys()を組み合わせる
多次元配列の各要素ごとにキーを取得したい場合は、foreach と array_keys() を組み合わせます。
$users = [
[
'id' => 1,
'name' => 'Taro',
'email' => 'taro@example.com',
],
[
'id' => 2,
'name' => 'Jiro',
'role' => 'admin',
],
];
foreach ($users as $index => $user) {
echo "{$index}番目のキー:" . PHP_EOL;
print_r(array_keys($user));
}
出力結果は次のようになります。
0番目のキー:
Array
(
[0] => id
[1] => name
[2] => email
)
1番目のキー:
Array
(
[0] => id
[1] => name
[2] => role
)
この例では、1件目と2件目で持っているキーが一部異なっています。
配列の構造が常に同じとは限らない場合は、このように各要素ごとにキーを確認するとよいでしょう。
多次元配列のすべてのキーを再帰的に取得する方法
再帰関数でキーを取得する
多次元配列のすべての階層からキーを取得したい場合は、再帰関数を使う方法があります。
function getAllKeys(array $array): array
{
$keys = [];
foreach ($array as $key => $value) {
$keys[] = $key;
if (is_array($value)) {
$keys = array_merge($keys, getAllKeys($value));
}
}
return $keys;
}
$data = [
'user' => [
'name' => 'Taro',
'profile' => [
'age' => 30,
'city' => 'Tokyo',
],
],
'status' => 'active',
];
$keys = getAllKeys($data);
print_r($keys);
出力結果は次のようになります。
Array
(
[0] => user
[1] => name
[2] => profile
[3] => age
[4] => city
[5] => status
)
この関数では、配列の中にさらに配列があった場合、その中のキーも再帰的に取得します。
重複するキーに注意する
同じキー名が複数の階層や要素に存在する場合、この関数は同じキーを重複して返します。
$data = [
'user' => [
'id' => 1,
],
'post' => [
'id' => 10,
],
];
この場合、id は複数回出てきます。
重複を除きたい場合は、array_unique() を使います。
$keys = array_unique(getAllKeys($data));
階層構造を保ってキーを取得する方法
ドット記法でキーのパスを取得する
多次元配列では、単にキー名だけを取得すると、どの階層のキーなのか分かりにくくなることがあります。
そのような場合は、ドット記法でキーのパスを取得すると便利です。
function getAllKeysWithPath(array $array, string $prefix = ''): array
{
$keys = [];
foreach ($array as $key => $value) {
$path = $prefix === '' ? (string) $key : $prefix . '.' . $key;
$keys[] = $path;
if (is_array($value)) {
$keys = array_merge($keys, getAllKeysWithPath($value, $path));
}
}
return $keys;
}
$data = [
'user' => [
'name' => 'Taro',
'profile' => [
'age' => 30,
'city' => 'Tokyo',
],
],
'status' => 'active',
];
$keys = getAllKeysWithPath($data);
print_r($keys);
出力結果は次のようになります。
Array
(
[0] => user
[1] => user.name
[2] => user.profile
[3] => user.profile.age
[4] => user.profile.city
[5] => status
)
このように取得すると、どの階層にあるキーなのかが分かりやすくなります。
設定ファイル、JSON、APIレスポンスの構造確認などで便利です。
キーにドットが含まれる場合の注意点
ドット記法を使う場合、キー自体に . が含まれていると見分けにくくなります。
$data = [
'user.name' => 'Taro',
'user' => [
'name' => 'Jiro',
],
];
このような配列では、user.name というキーと、user の中にある name というキーの区別がつきにくくなります。
厳密にパスを扱いたい場合は、区切り文字を変更するか、別の表現方法を検討するとよいでしょう。
配列キーの型に関する注意点
PHPの配列キーは文字列または整数
PHPの配列キーには、主に文字列または整数が使われます。
$array = [
'name' => 'Taro',
10 => 'ten',
'20' => 'twenty',
];
print_r(array_keys($array));
出力結果は次のようになります。
Array
(
[0] => name
[1] => 10
[2] => 20
)
この例では、'20' という文字列キーが整数キー 20 として扱われます。
数値文字列キーは整数に変換される場合がある
PHPでは、数値として解釈できる文字列キーが整数キーに変換される場合があります。
$array = [
'1' => 'one',
'01' => 'zero one',
];
print_r($array);
出力結果は次のようになります。
Array
(
[1] => one
[01] => zero one
)
'1' は整数キー 1 として扱われますが、'01' は文字列キーとして扱われます。
つまり、「数字に見える文字列がすべて整数キーになる」というわけではありません。
次のようなキーも注意が必要です。
$array = [
'8' => 'eight',
'+8' => 'plus eight',
'08' => 'zero eight',
'8.0' => 'eight point zero',
];
この場合、'8' は整数キーとして扱われやすい一方、'+8'、'08'、'8.0' は文字列キーとして扱われます。
配列キーの型を厳密に扱いたい場合は、キーがどのように変換されるかを意識しておく必要があります。
実務でよく使うパターン
フォーム入力の項目名を取得する
フォームから送信されたデータの項目名を取得したい場合にも、array_keys() が使えます。
$form = [
'username' => 'taro',
'email' => 'taro@example.com',
'password' => 'secret',
];
$fields = array_keys($form);
print_r($fields);
出力結果は次のとおりです。
Array
(
[0] => username
[1] => email
[2] => password
)
バリデーション対象の項目を確認したい場合などに便利です。
JSONを連想配列に変換してキーを取得する
JSON文字列を連想配列として扱いたい場合は、json_decode() の第2引数に true を指定します。
$json = '{"name":"Taro","email":"taro@example.com","age":30}';
$data = json_decode($json, true);
$keys = array_keys($data);
print_r($keys);
出力結果は次のようになります。
Array
(
[0] => name
[1] => email
[2] => age
)
json_decode($json, true) とすることで、JSONオブジェクトをPHPの連想配列として取得できます。
CSVのヘッダー行として使う
連想配列のキーをCSVのヘッダー行として使うこともできます。
$user = [
'name' => 'Taro',
'email' => 'taro@example.com',
'age' => 30,
];
$headers = array_keys($user);
echo implode(',', $headers);
出力結果は次のとおりです。
name,email,age
連想配列のキーがそのままカラム名として使える場合に便利です。
array_keys()とforeachの使い分け
キー一覧だけが欲しい場合
キーの一覧だけを配列として取得したい場合は、array_keys() が適しています。
$keys = array_keys($array);
取得したキーを別の処理で使い回したい場合にも便利です。
キーと値を処理したい場合
キーと値を同時に処理したい場合は、foreach が適しています。
foreach ($array as $key => $value) {
echo "{$key}: {$value}" . PHP_EOL;
}
array_keys() を使ってからループすることもできますが、値も使うのであれば、最初から foreach でキーと値を取り出す方が分かりやすく、余計な配列を作らずに済みます。
PHPの連想配列のキー取得方法まとめ
PHPで連想配列のキーを取得する場合、基本は array_keys() を使います。
$keys = array_keys($array);
キーと値を同時に扱いたい場合は、foreach を使います。
foreach ($array as $key => $value) {
// $key がキー
// $value が値
}
最初のキーだけを取得したい場合は、PHP 7.3以降であれば array_key_first() が使えます。
$firstKey = array_key_first($array);
最後のキーだけを取得したい場合は、array_key_last() を使います。
$lastKey = array_key_last($array);
指定した値を持つキーを取得したい場合は、array_keys() の第2引数を使います。
$keys = array_keys($array, $value);
型まで厳密に比較したい場合は、第3引数に true を指定します。
$keys = array_keys($array, $value, true);
キーの存在確認をしたい場合は、値が null でも存在を確認できる array_key_exists() を使うと安全です。
array_key_exists($key, $array);
一方、キーが存在し、かつ値が null ではないことを確認したい場合は、isset() が使えます。
isset($array[$key]);
連想配列のキー取得は、PHPで配列を扱ううえで非常によく使う基本操作です。
単純にキー一覧を取得するなら array_keys()、ループの中で処理するなら foreach、最初や最後のキーだけ欲しいなら array_key_first() や array_key_last() というように、目的に応じて使い分けるとよいでしょう。
以上、PHPの連想配列のキーの取得方法についてでした。
最後までお読みいただき、ありがとうございました。










