Upgrade to Pro — share decks privately, control downloads, hide ads and more …

なぜarray_firstとarray_lastは採用、 array_value_firstと...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for 02 02
March 22, 2026

なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは 見送りだったか / Why array_value_first and array_value_last was declined, then why array_first and array_last was accpeted?

2026/03/22 PHPerKaigi 2026 LTにて話したときに使用したスライドです

Avatar for 02

02

March 22, 2026
Tweet

More Decks by 02

Other Decks in Technology

Transcript

  1. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか | BASE,

    Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは 見送りだったか 02 @PHPerKaigi2026 2026.03.22
  2. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか Speaker Profile

    2 02 Otsu Kazuki BASE BANK Dept. Engineering Program Manager :@cocoeyes02 PHPカンファレンス2024, 2025 実行委員長
  3. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 3 本日のまとめ

    • array_value_first / array_value_last ◦ 論点が収束しないまま投票に進み、否決された ◦ 主な論点は、空配列の扱いと、汎用化の是非 • array_first / array_last ◦ 既存array関数と一貫性を保ち、対応するスコー プを絞ることで、同意が得られ採択された
  4. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 5 array_first

    / array_lastとは? PHP 8.5において、配列の最初 / 最後の値を取得できる新関数 array_first と array_last が導入された https://www.php.net/releases/8.5/ja.php
  5. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか PHP 8.4まで

    6 array_first / array_lastとは? $array = [2 => 'first', 'hoge' => 'c', 1 => 'last']; echo $array[0]; // Warning: Undefined array key 0 echo reset($array); // "first"(内部ポインタの副作用あり) echo end($array); // "end"(内部ポインタの副作用あり) echo $array[array_key_first($array)]; // "first" echo $array[array_key_last($array)]; // "last"
  6. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか PHP 8.5から

    7 array_first / array_lastとは? $array = [2 => 'first', 'hoge' => 'c', 1 => 'last']; echo array_first($array); // "first" echo array_last($array); // "last" echo array_first([]); // NULL echo array_last([]); // NULL
  7. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 9 2013/05/17

    2016/01/01 2018/06/11 2018/07/09 2025/03/31 2025/04/22 array_first / array_last採用までの時系列 初出のPRがopen 最初のRFC公開 2つ目のRFC公開(array_key_first / array_key_last と、 array_value_first / array_value_last) 2つ目のRFC投票(key系は採択(PHP 7.3)、value系は否決) 3つ目のRFC公開(array_first / array_last) 3つ目のRFC投票(採択(PHP 8.5))
  8. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 10 2013/05/17

    2016/01/01 2018/06/11 2018/07/09 2025/03/31 2025/04/22 array_first / array_last採用までの時系列 初出のPRがopen 最初のRFC公開 2つ目のRFC公開(array_key_first / array_key_last と、 array_value_first / array_value_last) 2つ目のRFC投票(key系は採択(PHP 7.3)、value系は否決) 3つ目のRFC公開(array_first / array_last) 3つ目のRFC投票(採択(PHP 8.5)) 今回はarray_value_first / array_value_lastの否決と array_first / array_lastの採択について話します!
  9. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 関数名以外は、array_first /

    array_lastと仕様は同じだが、目 立った論点が2つあった • 空配列の時の返り値について • 汎用化 vs 単機能 12 array_value_first / array_value_lastの仕様
  10. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 値がNULL or

    空配列 区別がつかない 13 目立った論点1:空配列の時の返り値について $array2 = [2 => null, 'hoge' => 'c', 1 => null]; echo array_value_first($array2); // NULL echo array_value_first([]); // NULL echo array_value_first($hoge); // NULL // $hoge は 最初の値がNULL?それとも空配列?
  11. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 14 汎用化派

    • 「index/offset で任意の位置のキーや値を取りたい」 • 「タプルつかって1メソッドでキーも値も返したい」 目立った論点2:汎用化 vs シンプル [$key, $value] = array_first($array); [$key, $value] = array_last($array); //(0なら最初、-1なら最後) $key = array_key_index($array, 0, &$value);
  12. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 15 シンプル派

    • 「個別関数の方が直感的だし、タプル返却はPHPコア関数の 慣例にない」 • 「index/offsetはO(n)。first/lastはO(1)で十分」 $value = array_value_first($array); $value = array_value_last($array); 目立った論点2:汎用化 vs シンプル
  13. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 16 結果はYes:15,

    No:18で否決(当時は過半数のYesで採択)               … 落とし所が決まらないまま投票へ https://wiki.php.net/rfc/array_key_first_last
  14. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 17 RFCにも下記のような事が(意訳)

    > (前略)RFCが完成し、すべての詳細が検討され議論されたと 判断された場合、 RFCは投票フェーズに移行できます。RFCには 未解決の疑問点があってはなりません。(後略) 落とし所が決まらないまま投票へ https://wiki.php.net/rfc/howto
  15. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 19 array_value_first

    / array_value_lastと同じ仕様にも関わらず、 採択された要因は大きく2つ • 既存機能(array関数)との一貫性を保つ • 今回のRFCで対応するスコープを絞る この2つの要因を踏まえて、前回のRFCの論点が今回どうなのか見 ていく 今回のRFCが採択された要因
  16. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 20 •

    array_first / array_last だけ仕様を変えると一貫性が崩れる • • • • • 「変えるなら全部変える」で今回のRFCのスコープ外に ◦ スコープ外になっただけで、解決したわけじゃない array_pop([]); array_shift([]); // NULL array_key_first([]); // NULL (PHP7.3) array_find([], fn($v) => true); // NULL (PHP 8.4) 前回のRFCの論点①:空配列の時の返り値について
  17. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 21 •

    タプルや汎用化はスコープから外す方針で、異論がなかった ◦ タプルに関しては、そもそも求める声が出なかった ◦ 汎用化は求める声があったが、別のRFCに委ねられた ▪ 汎用化された関数はいつか出てくるかもしれない 前回のRFCの論点②:汎用化 vs シンプル
  18. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 22 •

    reset / end では readonly プロパティに使えない ◦ PHP 8.2 (2022年) で readonly が入った ◦ 副作用を避けたい → そもそも使えないが発生するように • 他の関数名と命名規則を統一した ◦ キーを操作する関数は名前に「key」が含まれる ◦ 値を操作する関数は名前に「value」が含まれない 他にも前回のRFCとの違いが
  19. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 23 •

    reset / end では readonly プロパティに使えない class EventList { public function __construct( public readonly array $events ) {} } $list = new EventList(['a', 'b', 'c']); reset($list->events); // Cannot pass readonly property by reference array_first($list->events); // 'a' ← 動く 他にも前回のRFCとの違いが
  20. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 24 結果はYes:35

    No:0で、満場一致の賛成!               … 議論も落ち着き、満を持して投票へ https://wiki.php.net/rfc/array_first_last
  21. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 25 PHP

    コントリビューターたちは、メーリスや RFC を通して、 様々な観点から、議論を重ねてリリースしています。 • 理想的な設計 • パフォーマンス • PHP らしさ 議論の流れを追っていくと、ただ歴史を知るだけでなく、PHPや 設計への理解を深めることができます。是非追ってみましょう! 最後に
  22. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 26 •

    PHP manual: array_first • PHP manual: array_last • PHP manual: end • PHP manual: reset • PHP manual: rfc:howto 参考文献(PHPマニュアル)
  23. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 27 •

    PHP RFC: array_key_first_last_index • PHP RFC: array_key_first(), array_key_last() and array_value_first(), array_value_last() • PHP RFC: array_first() and array_last() 参考文献(PHP RFC)
  24. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 28 •

    Github PR: Add array_key_first(), array_key_last(), and array_key_index() • Github PR: Add implementation and tests for array_key_first, array_key_last and array_value_first, array_value_last • Github PR: [RFC] Implement array_first() and array_last() 参考文献(Github PR)
  25. #phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 29 •

    externals.io: [RFC] array_key_(first|last|index) functions proposal • externals.io: [RFC][Under Discussion] Add functions array_key_first() and array_key_last() • externals.io: [VOTE] array_key_first(), array_key_last(), array_value_first(), array_value_last() • externals.io: Two new functions array_first() and array_last() • externals.io: [RFC] [Discussion] array_first() and array_last() • externals.io: [RFC] [Vote] array_first() and array_last() 参考文献(externals.io)