last — 配列の末尾(条件付き)要素を取得

helper
  • カテゴリ: helper
  • 掲載バージョン: Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンド: global function lastIlluminate\Support\Arr::last のエイリアス)
  • 関連: head / Illuminate\Support\Arr::last / Collection::last / PHP end
  • 変更履歴: Laravel 6 以降も利用可。Arr::last と同等仕様。

要点(TL;DR)

  • 配列の最後の要素、または条件を満たす最後の要素を返す
  • last($array, $callback, $default)
  • 罠:配列以外は TypeError、空配列や不一致は null(既定)を返すので既定値を渡す

概要

last は配列の末尾要素を取得するヘルパ。コールバックを渡すと「条件を満たす最後の要素」を返せます。空配列や一致なしの場合は既定値(省略時は null)を返します。内部ポインタを動かさないため、end() より副作用が少なく安全です。

構文 / シグネチャ

function last(array $array, ?callable $callback = null, mixed $default = null): mixed
  • 引数(表) 引数 型 必須 既定値 説明 $array array ✅ — 走査対象の配列 $callback callable(null|callable) null fn($value, $key): bool で合致判定 $default mixed null 一致なし・空配列時に返す値
  • 戻り値mixed(最後の要素、または合致要素/なければ $default
  • 例外/副作用array 以外を渡すと TypeError。内部ポインタ変更なし(end() と違い副作用なし)。

使用例

最小例

$last = last([1, 2, 3]);            // 3
$even = last([1, 2, 3, 4], fn($v)=>$v % 2 === 0);   // 4
$none = last([1, 2, 3], fn($v)=>$v > 10, 'N/A');    // 'N/A'

実務例

// APIログ(配列)から「最後のエラーイベント」を取得
$events = [
    ['type' => 'info',  'id' => 1],
    ['type' => 'error', 'id' => 2],
    ['type' => 'info',  'id' => 3],
    ['type' => 'error', 'id' => 4],
];

$lastError = last($events, fn($e) => ($e['type'] ?? null) === 'error', null);

if ($lastError !== null) {
    // 直近エラーのIDで再試行など
    // retryJob($lastError['id']);
}
// Eloquent の JSON カラムや外部API結果を配列で受け取り、ガード付きで利用
try {
    $items = $order->items; // 配列想定(cast: array 推奨)
    $lastPaid = last($items, fn($i)=>($i['status'] ?? '') === 'paid', null);
} catch (TypeError $e) {
    // items が配列でない場合のフォールバック
    $items = is_array($order->items) ? $order->items : [];
    $lastPaid = last($items, fn($i)=>($i['status'] ?? '') === 'paid', null);
}

よくある落とし穴・注意

  • 配列必須:コレクションは ->all() で配列化、または Collection::last() を使用。
  • null と不一致の区別:空配列や不一致は null になり紛らわしい。必要なら $default を明示。
  • キーは返らない:戻りは値のみ。該当キーが必要なら自前で走査する。
  • 計算量:コールバックなしはほぼ O(1)、ありは最悪 O(n)。

代替・関連APIとの比較

  • Illuminate\Support\Arr::last:同等機能。静的呼び出しを好む場合に。
  • Collection::last($callback = null, $default = null):配列化不要でチェーン可、遅延列挙系とも相性良。
  • PHP end($array):内部ポインタを動かす副作用あり。条件指定不可。
  • PHP array_key_last($array):末尾キー取得のみ。条件指定不可。

選定基準

  • コレクション連鎖中 → Collection::last
  • 配列をそのまま扱う/副作用なし → last
  • 静的ユーティリティで統一 → Arr::last

テスト例(Pest)

it('returns the last matching element', function () {
    $v = last([1,2,3,4], fn($n)=>$n % 2 === 0);
    expect($v)->toBe(4);

    $v2 = last([], null, 'fallback');
    expect($v2)->toBe('fallback');
});

トラブルシュート(エラー別)

症状/エラー原因対処
TypeError: last(): Argument #1 ($array) must be of type array配列以外を渡している配列へキャスト、->all() で配列化、または Collection::last() を使用
null が返る空配列/不一致第3引数に既定値を渡す。例:last($a, $cb, 'N/A')
該当要素のキーも欲しいlast は値のみ逆走査で自前判定(for ($i=count($a)-1; $i>=0; $i--))や Collection でキー同定

ヘルパー特記事項(helperカテゴリ)

  • フレームワーク依存/純PHP代替:Laravel ヘルパ。代替は end()(副作用あり)や手動走査。
  • コンテナ/グローバル状態:依存なし・副作用なし。
  • ネスト/ワイルドカード:適用外(キー探索が必要なら data_get 等と併用)。

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする