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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
02
March 22, 2026
Technology
0
5
なぜ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
Tweet
Share
More Decks by 02
See All by 02
Amazon ECS Managed Instances が リリースされた!キャッチアップしよう!! / Let's catch up Amazon ECS Managed Instances
cocoeyes02
0
500
新しいPHP拡張モジュールインストール方法「PHP Installer for Extensions (PIE)」を使ってみよう!
cocoeyes02
0
1.6k
PHP8.4におけるJITフレームワークIRと中間表現について理解を深める
cocoeyes02
1
1.2k
RemoveだらけのPHPUnit 12に備えよう
cocoeyes02
0
1.2k
PHP RFC: Deprecate implicitly nullable parameter types をサクッと話す
cocoeyes02
0
1k
PHPUnit 11 概論
cocoeyes02
5
3.4k
Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\Randomizer class solves familiar trouble
cocoeyes02
1
1.3k
BASEにおける インシデント対応フローと工夫
cocoeyes02
0
1.2k
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
ソフトバンク流!プラットフォームエンジニアリング実現へのアプローチ
sbtechnight
1
190
SRE NEXT 2026 CfP レビュアーが語る聞きたくなるプロポーザルとは?
yutakawasaki0911
1
440
Tebiki Engineering Team Deck
tebiki
0
27k
visionOS 開発向けの MCP / Skills をつくり続けることで XR の探究と学習を最大化
karad
1
640
[JAWSDAYS2026]Who is responsible for IAM
mizukibbb
0
880
"作る"から"使われる"へ:Backstage 活用の現在地
sbtechnight
0
190
NewSQL_ ストレージ分離と分散合意を用いたスケーラブルアーキテクチャ
hacomono
PRO
4
400
Go 1.26 Genericsにおける再帰的型制約 / Recursive Type Constraints in Go 1.26 Generics
ryokotmng
0
120
[E2]CCoEはAI指揮官へ。Bedrock×MCPで構築するコスト・セキュリティ自律運用基盤
taku1418
0
190
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
2
13k
Yahoo!ショッピングのレコメンデーション・システムにおけるML実践の一例
lycorptech_jp
PRO
1
230
脳内メモリ、思ったより揮発性だった
koutorino
0
380
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
180
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
380
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
100
Designing Experiences People Love
moore
143
24k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
74
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
150
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Writing Fast Ruby
sferik
630
63k
It's Worth the Effort
3n
188
29k
The Spectacular Lies of Maps
axbom
PRO
1
630
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.5k
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)