array_key_firstとarray_key_lastで先頭末尾のキーを素直に取る
array_key_first と array_key_last とは、配列の内部ポインタを動かさずに先頭・末尾のキーをそのまま返す関数です。PHP 7.3 以降で使え、reset や end の副作用を避けられます。
reset/endは内部ポインタを動かす
連想配列の先頭キーが欲しいとき、昔は reset($arr); $key = key($arr); のように書いていました。ただ reset や end は配列の内部ポインタを動かす副作用があるので、他の場所で current() を使っていたりすると噛み合わなくなることがあります。値だけ見たいのにポインタが動く、というのは地味に嫌なんですよね。
$arr = ['x' => 1, 'y' => 2, 'z' => 3];
// 昔ながらのやり方(ポインタが動く)
end($arr);
$lastKey = key($arr); // 'z'
キーだけが欲しいならこの2関数
PHP 7.3 以降は array_key_first と array_key_last があります。ポインタに触らず先頭・末尾のキーをそのまま返してくれるので、意図が読みやすいですし副作用の心配もありません。値ではなくキーが返る、という点だけ押さえておけば迷いません。
$arr = ['x' => 1, 'y' => 2, 'z' => 3];
$first = array_key_first($arr); // 'x'
$last = array_key_last($arr); // 'z'
// 値が欲しければキー経由で
$firstValue = $arr[$first]; // 1
空配列のときはnullが返る
ハマりどころは空配列を渡したときで、どちらも null を返します。例外は投げないので、返ってきたキーをそのまま添字に使うと未定義キー扱いになることがあります。空かどうかを先に見るか、返り値の null を判定しておくのが無難ですね。
$empty = [];
$k = array_key_first($empty); // null
if ($k === null) {
// 空配列だった、という分岐
}
まとめ
先頭・末尾のキーが欲しいだけなら、reset/end で回り道せずに array_key_first / array_key_last を使うのが素直だと思います。ポインタを動かさないので他の処理と干渉しないのが一番の利点ですね。返るのはキーであること、空だと null が来ること、この2点だけ覚えておけば安心して使える気がします。
よくある質問
Q. 空配列を渡すとどうなりますか?
A. どちらも null を返します。例外は投げないので、返ってきたキーをそのまま添字に使う前に、空かどうかや null かを確認しておくと安全です。
Q. キーではなく先頭の値が欲しいときは?
A. 返るのはキーなので、$arr[array_key_first($arr)] のようにキー経由で値を取り出します。値そのものを直接返す関数ではない点に注意ですね。