PHP の連想配列を扱っていると、「最初のキーだけ知りたい」「最後の要素のキーを取りたい」「このキーは存在するか確認したい」といった場面がよくあります。こうしたときに役立つのが array_key_first・array_key_last・array_key_exists の3つの関数です。この記事では、それぞれの基本的な使い方と戻り値、isset との違い、使うときの注意点までをコード例つきで解説します。
目次
3つの関数でできること
いずれも配列の「キー」に関する操作を行う関数です。まず全体像を押さえておきましょう。
| 関数 | できること |
|---|---|
array_key_first() | 配列の先頭の要素のキーを取得する |
array_key_last() | 配列の末尾の要素のキーを取得する |
array_key_exists() | 指定したキーが配列に存在するかを調べる |
array_key_first と array_key_last は PHP 7.3 以降で使えます。連想配列(キーに文字列を使う配列)でも、添字配列(0・1・2…の配列)でも同じように動きます。
先頭・末尾のキーを取得する
array_key_first は配列の最初の要素の、array_key_last は最後の要素のキーを返します。「値」ではなく「キー」が返る点に注意してください。
<?php
$prices = [
'apple' => 120,
'orange' => 80,
'grape' => 300,
];
// 先頭・末尾の「キー」を取得
$firstKey = array_key_first($prices);
$lastKey = array_key_last($prices);
echo $firstKey; // 'apple'
echo $lastKey; // 'grape'
// キーが分かれば値も取れる
echo $prices[$firstKey]; // 120
キーさえ分かれば $prices[$firstKey] のように値も取り出せます。連想配列は順序を持っているため、「登録した順で最初/最後の要素」を安定して取得できるのがこれらの関数の便利なところです。
なお、空の配列を渡すと両関数とも null を返します。要素があるか不安な場合は、先に empty() や count() で確認しておくと安全です。
キーが存在するか確認する
array_key_exists は、第1引数のキーが第2引数の配列に存在すれば true、なければ false を返します。値の内容は問わず、あくまで「そのキーがあるかどうか」だけを判定します。
<?php
$user = [
'name' => '田中',
'email' => 'tanaka@example.com',
];
if (array_key_exists('email', $user)) {
echo 'メールアドレスが登録されています';
}
if (!array_key_exists('phone', $user)) {
echo '電話番号は未登録です';
}
設定値の配列から特定のキーがあるかを調べたり、必須項目がそろっているかをチェックしたりする場面で活躍します。
array_key_exists と isset の違い
キーの存在チェックには isset() もよく使われますが、両者には重要な違いがあります。値が null のときの扱いです。isset() は「キーが存在し、かつ値が null でない」ときに true を返すため、値が null のキーは「存在しない」と判定されてしまいます。一方 array_key_exists() は値が null でもキーさえあれば true を返します。
<?php
$data = ['key' => null];
// isset は値が null だと false になる
var_dump(isset($data['key'])); // bool(false)
// array_key_exists はキーがあれば true
var_dump(array_key_exists('key', $data)); // bool(true)
使い分けの目安は次の通りです。値が null であっても「キーがあるか」を厳密に判定したいなら array_key_exists() を使います。「キーがあって、なおかつ中身が入っているか(null でないか)」まで一度に確かめたいなら isset() が便利です。多くの場面では isset() で十分ですが、null を意味のある値として保存している配列では array_key_exists() を選びましょう。
使うときの注意点
返るのは「値」ではなく「キー」
array_key_first と array_key_last がよく誤解されるのが、返り値がキーである点です。「先頭の値が返る」と思って $firstKey をそのまま表示すると、想定と違う結果になります。値が欲しいときは、得られたキーを使って $array[$key] のようにアクセスします。
内部ポインタは動かない
先頭・末尾の要素を取る方法として、古くは reset() や end() も使われてきました。これらは配列の内部ポインタ(現在位置)を動かす副作用があり、ループ中に使うと予期しない不具合の原因になります。array_key_first・array_key_last はポインタを動かさずにキーを取得できるため、より安全に使えます。
まとめ
array_key_first は先頭、array_key_last は末尾の要素のキーを、内部ポインタを動かさずに取得できる関数です。返るのは値ではなくキーである点に注意しましょう。array_key_exists は指定したキーが配列にあるかを判定し、値が null でもキーがあれば true を返すのが isset() との大きな違いです。値の null を区別したいときは array_key_exists()、中身が入っているかまで確認したいときは isset()、と目的で使い分けるのがポイントです。