PHPの連想配列のキーの取得方法について

採用はこちら

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() は、配列のキーだけを取り出し、新しい配列として返します。

この例では、元の連想配列のキーである nameemailage が取得されています。

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件目のユーザー情報から idnameemail というキーを取得しています。

空配列を考慮する場合

実務では、$users[0] が存在しない可能性もあります。

その場合は、次のように書くと安全です。

$keys = array_keys($users[0] ?? []);

$users[0] が存在しない場合でも、空配列に対して array_keys() を実行するため、エラーを避けやすくなります。

多次元配列の各要素のキーを取得する方法

foreachとarray_keys()を組み合わせる

多次元配列の各要素ごとにキーを取得したい場合は、foreacharray_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の連想配列のキーの取得方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次