元の配列データを変更せずに先頭の要素を取得する

配列の先頭の要素を取得する関数として array_shift() がある。

ただし、array_shift() は先頭の要素を配列から取り除いてしまうので、「元の配列データを変更せずに」という制約がある場合、array_shift() は使えない。

このような場合、reset() が使える。関数名からは想像が付かないが、reset() は、配列の内部ポインタを先頭の要素に戻し、そして、「配列の最初の要素の値」を返してくれる。

reset() を使えば、元の配列データを変更せず、また、先頭のキーが不明な場合でも、先頭の要素を取得できる。


$array = [
  'status_130134' => ['text' => "hi",  'date' => "20200101"]
];

$v = reset($array); // 配列の先頭の要素を取得

var_dump($v);
/* var_dump 出力
array(2) {
  ["text"]=>
  string(2) "hi"
  ["date"]=>
  string(8) "20200101"
}
*/
var_dump($array);
/* var_dump 出力
元の配列データが変更されていないことを確認
array(1) {
  ["status_130134"]=>
  array(2) {
    ["text"]=>
    string(2) "hi"
    ["date"]=>
    string(8) "20200101"
  }
}
*/

reset() という関数名と実際の処理の意図が合っていないことで、コードの可読性を懸念する場合、reset() を適当な名前を付けた関数でラップしてもよいだろう。


// reset()をheadという名前を付けた関数でラップ
function head($array)
{
  return reset($array);
}

$array = [
  'status_130134' => ['text' => "hi",  'date' => "20200101"]
];

$v = head($array); // 配列の先頭の要素を取得
var_dump($v);
/*
array(2) {
  ["text"]=>
  string(2) "hi"
  ["date"]=>
  string(8) "20200101"
}
*/

実際、Laravelのヘルパー関数 head()(配列の先頭の要素を返す関数)は、reset() の返り値を返す関数として実装されている。Laravelのヘルパー関数のソースコードを確認したい場合は、下記のリンクからソースコードを読むことができる。
framework/helpers.php at master · laravel/framework · GitHub