論理型の値を保持する配列の先頭要素を取得する際の注意点

過去の記事reset() を使って配列の先頭要素を取得する方法について書いたが、論理型の値を保持する配列に対しては注意が必要である。

論理型の配列データの先頭要素が false の場合、reset()false を返すが、reset() は空の配列に対しても false を返すため、どちらも同じ false も得てしまう。


function head($array)
{
  return reset($array); // 配列の先頭要素を取得
}

$array1 = [false, true, false];
$array2 = [];

$v1 = head($array1);
var_dump($v1);
/* var_dump 出力
bool(false)
*/
$v2 = head($array2);
var_dump($v2);
/*
bool(false)
*/
var_dump($v1 === $v2);
/*
bool(true)
*/

どちらも false を得てしまう問題を回避するには、reset() を呼ぶ際に count() で配列の要素数を確認するか、key() の返り値が null でないことを確認する必要がある。


function head($array)
{
  return reset($array); // 配列の先頭要素を取得
}

$array1 = [false, true, false];
$array2 = [];

$v1 = count($array1) ? head($array1) : null;
$v2 = count($array2) ? head($array2) : null;
var_dump($v1 === $v2);
/*
bool(false)
*/

$v1 = !is_null(key($array1)) ? head($array1) : null;
$v2 = !is_null(key($array2)) ? head($array2) : null;
var_dump($v1 === $v2);
/*
bool(false)
*/