12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

配列の最初or最後のキーを取り出す(PHP7.3)

Last updated at Posted at 2018-12-13

追記

空いていたので、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以前の場合

地味に面倒でした。

php72.php

$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()を使いましょう。

php73.php

$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"
12
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?