Slide 1

Slide 1 text

#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

Slide 2

Slide 2 text

#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 実行委員長

Slide 3

Slide 3 text

#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関数と一貫性を保ち、対応するスコー プを絞ることで、同意が得られ採択された

Slide 4

Slide 4 text

#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

Slide 5

Slide 5 text

#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

Slide 6

Slide 6 text

#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"

Slide 7

Slide 7 text

#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

Slide 8

Slide 8 text

#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

Slide 9

Slide 9 text

#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))

Slide 10

Slide 10 text

#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の採択について話します!

Slide 11

Slide 11 text

#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

Slide 12

Slide 12 text

#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の仕様

Slide 13

Slide 13 text

#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?それとも空配列?

Slide 14

Slide 14 text

#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);

Slide 15

Slide 15 text

#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 シンプル

Slide 16

Slide 16 text

#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

Slide 17

Slide 17 text

#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

Slide 18

Slide 18 text

#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

Slide 19

Slide 19 text

#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が採択された要因

Slide 20

Slide 20 text

#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の論点①:空配列の時の返り値について

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

#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との違いが

Slide 23

Slide 23 text

#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との違いが

Slide 24

Slide 24 text

#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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

#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マニュアル)

Slide 27

Slide 27 text

#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)

Slide 28

Slide 28 text

#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)

Slide 29

Slide 29 text

#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)