Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
なぜarray_firstとarray_lastは採用、 array_value_firstと...
Search
02
March 22, 2026
Technology
440
0
Share
なぜ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にて話したときに使用したスライドです
02
March 22, 2026
More Decks by 02
See All by 02
Amazon ECS Managed Instances が リリースされた!キャッチアップしよう!! / Let's catch up Amazon ECS Managed Instances
cocoeyes02
0
510
新しいPHP拡張モジュールインストール方法「PHP Installer for Extensions (PIE)」を使ってみよう!
cocoeyes02
0
1.8k
PHP8.4におけるJITフレームワークIRと中間表現について理解を深める
cocoeyes02
1
1.3k
RemoveだらけのPHPUnit 12に備えよう
cocoeyes02
0
1.3k
PHP RFC: Deprecate implicitly nullable parameter types をサクッと話す
cocoeyes02
0
1.1k
PHPUnit 11 概論
cocoeyes02
5
3.7k
Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\Randomizer class solves familiar trouble
cocoeyes02
1
1.4k
BASEにおける インシデント対応フローと工夫
cocoeyes02
0
1.3k
AWS Lambdaから始める Devチームの小さなDevOps改善 〜QCDどれも諦めない運用を目指して〜 / Start to improving small DevOps with AWS Lambda by Dev Team
cocoeyes02
0
1.5k
Other Decks in Technology
See All in Technology
バイブコーディングで3倍早く⚪⚪を作ってみた
samakada
0
210
20260428_Product Management Summit_tadokoroyoshiro
tadokoro_yoshiro
15
18k
Microsoft 365 / Microsoft 365 Copilot : 自分の状態を確認する「ラベル」について
taichinakamura
0
450
Fabric MCPの紹介と使い分け
ryomaru0825
1
110
ハーネスエンジニアリング入門
knishioka
0
110
「SaaSの次の時代」に重要性を増すステークホルダーマネジメントの要諦 ~解像度を圧倒的に高めPdMの価値を最大化させる方法~
kakehashi
PRO
3
3.6k
コードや知識を組み込む / Incorporate Code and Knowledge
ks91
PRO
0
210
AI駆動開発で生産性を追いかけたら、行き着いたのは品質とシフトレフトだった
littlehands
0
310
AgentCore×VPCでの設計パターンn選と勘所
har1101
4
370
AWS Transform CustomでIaCコードを自由自在に変換しよう
duelist2020jp
0
240
独断と偏見で試してみる、 シングル or マルチエージェント どっちがいいの?
shichijoyuhi
1
240
変化の激しい時代をゴキゲンに生き抜くために 〜ストレスマネジメントのススメ〜
kakehashi
PRO
4
830
Featured
See All Featured
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
530
GraphQLとの向き合い方2022年版
quramy
50
15k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
900
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
160
Fireside Chat
paigeccino
42
3.9k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
200
Color Theory Basics | Prateek | Gurzu
gurzu
0
300
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.2k
Transcript
#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
#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 実行委員長
#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関数と一貫性を保ち、対応するスコー プを絞ることで、同意が得られ採択された
#phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか © 2012-2026
BASE, Inc. 4 array_first / array_lastとは? 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
#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"
#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
#phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか © 2012-2026
BASE, Inc. 8 array_first / array_last 採用までの時系列 8
#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))
#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の採択について話します!
#phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか © 2012-2026
BASE, Inc. 11 なぜarray_value_firstと array_value_lastは見送りだったか 11
#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の仕様
#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?それとも空配列?
#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);
#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 シンプル
#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
#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
#phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか © 2012-2026
BASE, Inc. 18 なぜarray_firstとarray_lastは 採用されたか 18
#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が採択された要因
#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の論点①:空配列の時の返り値について
#phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 21 •
タプルや汎用化はスコープから外す方針で、異論がなかった ◦ タプルに関しては、そもそも求める声が出なかった ◦ 汎用化は求める声があったが、別のRFCに委ねられた ▪ 汎用化された関数はいつか出てくるかもしれない 前回のRFCの論点②:汎用化 vs シンプル
#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との違いが
#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との違いが
#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
#phperkaigi #a © 2012-2026 BASE, Inc. なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは見送りだったか 25 PHP
コントリビューターたちは、メーリスや RFC を通して、 様々な観点から、議論を重ねてリリースしています。 • 理想的な設計 • パフォーマンス • PHP らしさ 議論の流れを追っていくと、ただ歴史を知るだけでなく、PHPや 設計への理解を深めることができます。是非追ってみましょう! 最後に
#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マニュアル)
#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)
#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)
#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)