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
0
18
なぜ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
Laravelで学ぶOAuthとOpenID Connectの基礎と実装
kyoshidaxx
0
110
猫でもわかるKiro CLI(AI 駆動開発への道編)
kentapapa
0
270
フロントエンド刷新 4年間の軌跡
yotahada3
0
500
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
2
13k
AI時代のSaaSとETL
shoe116
1
190
「お金で解決」が全てではない!大規模WebアプリのCI高速化 #phperkaigi
stefafafan
4
1.5k
A Casual Introduction to RISC-V
omasanori
0
420
VLAモデル構築のための AIロボット向け模倣学習キット
kmatsuiugo
0
280
Kiro Powers 入門
k_adachi_01
0
120
CyberAgentの生成AI戦略 〜変わるものと変わらないもの〜
katayan
0
280
【Oracle Cloud ウェビナー】【入門編】はじめてのOracle AI Data Platform - AIのためのデータ準備&自社用AIエージェントをワンストップで実現
oracle4engineer
PRO
1
170
OCHaCafe S11 #2 コンテナ時代の次の一手:Wasm 最前線
oracle4engineer
PRO
2
150
Featured
See All Featured
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
310
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
How Software Deployment tools have changed in the past 20 years
geshan
0
33k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
640
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Paper Plane
katiecoart
PRO
0
48k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
310
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.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)