追記
空いていたので、PHP Advent Calendar 2018の13日目の記事として参加させてもらいました。
先日、PHP7.3がリリースされましたね。
今まで地味に面倒だった表題の件が簡単になったので紹介します。
TL;DR
PHP7.3以降はarray_key_first()
とarray_key_last()
を使いましょう。副作用もありません。
http://php.net/manual/ja/function.array-key-first.php
http://php.net/manual/ja/function.array-key-last.php
PHP7.2以前の場合
地味に面倒でした。
$arr = ['a' => 'Alice', 'b' => 'Bob'];
# わざわざポインタを動かしてから取得しないといけない
reset($arr);
key($arr);
# => "a"
end($arr);
key($arr);
# => "b"
# わざわざキーだけの配列を生成してから取得。しかも作った配列$keysを破壊する
$keys = array_keys($arr);
array_shift($keys);
# => "a"
$keys = array_keys($arr);
array_pop($keys);
# => "b"
# 呼ぶたびに変わっていく...
array_pop($keys);
# => "a"
array_pop($keys);
# => null
# 強引に一行でやろうとするとE_NOTICEをだす
reset(array_keys($arr));
# => PHP Notice: Only variables should be passed by reference...
PHP7.3の場合
追加されたarray_key_first()
とarray_key_last()
を使いましょう。
$arr = ['a' => 'Alice', 'b' => 'Bob'];
array_key_first($arr);
# => "a"
array_key_last($arr);
# => "b"
# 何回呼んでもOK
array_key_last($arr);
# => "b"
# ちなみに空配列の場合はNULLです
array_key_last([]);
# => null
ちなみに
RFCをみるとarray_key_first/lastは賛成18/反対14で採用、array_value_first/lastは賛成15/反対18で不採用なので、最初/最後の値を取り出す関数はありません。賛否分かれる機能のようですね。keyを採用したのならvalueも採用して欲しかったですが。。
https://wiki.php.net/rfc/array_key_first_last
最後の値を取るのは依然として面倒と言えば面倒ですね
$arr = ['a' => 'Alice', 'b' => 'Bob'];
# 今まで(ポインタが移動しちゃう)
end($arr);
# => "Bob"
# 存在チェックが必要なのでこれはこれで長い。いい方法あるかな?
$lastkey = array_key_last($arr);
array_key_exists($lastkey, $arr) ? $arr[$lastkey] : null
# => "Bob"