pop — 末尾の要素を取り出して削除

collection
  • カテゴリ: collection
  • 掲載バージョン: Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンド: Illuminate\Support\Collection::pop
  • 関連: last / take / slice / shift / pull
  • 変更履歴: (—)

要点(TL;DR)

  • コレクション末尾の要素を返して削除する(破壊的)
  • 最低限の使い方:$last = collect([1,2,3])->pop(); // 3
  • よくある罠
    • 破壊的なので元のコレクションが短くなる
    • $count > 1 で返るのは新しい Collection(元は短くなる)
    • LazyCollection 非対応pop() は使えない)

概要

pop はコレクションの末尾から要素を取り出し、同時にコレクションから削除します。キューやスタックの後処理、末尾 N 件を切り分けて保存/送信したい場面で有効です。$count を指定すれば末尾から複数要素をまとめて取り出せます。

構文 / シグネチャ

// 末尾から取り出して削除
mixed|Illuminate\Support\Collection pop(int $count = 1)

引数(表)

引数必須既定値説明
$countint1取り出す末尾要素の数。1 なら単一要素を返す。2 以上で新しい Collectionを返す。
  • 戻り値$count === 1 のときは単一要素(mixed)。$count > 1 のときは取り出した要素を格納した Collection(元のキーを保持)。
  • 例外/副作用:例外は基本なし。元コレクションが短くなる(破壊的)。空コレクションに対しては null を返す。
    LazyCollection は非対応Illuminate\Support\LazyCollectionpop は存在しない)。

コレクション特性(collectionルール)

  • チェーン可否pop()(単一)は値を返すためその場でチェーン終了pop(n) は新しい Collection を返すので返り値に対してはチェーン可(ただし元は短くなる)。
  • 破壊的/非破壊破壊的(元から削除)。
  • キー保持pop(n) の返り値は元のキーを保持。元コレクション側も既存要素のキーは保持。
  • LazyCollection非対応
  • 計算量の目安pop()O(1)pop(n)O(n)

入出力対応表(小サンプル)

入力コレクション呼び出し返り値呼び出し後の元
[1,2,3]pop()3[1,2]
['a'=>10,'b'=>20]pop()20['a'=>10]
[1,2,3,4]pop(2)collect([3,4])(キー保持)[1,2]

使用例

最小例

<?php

use Illuminate\Support\Collection;

$numbers = collect([1, 2, 3]);

$last = $numbers->pop(); // 3
// $numbers は [1, 2]

$tail = collect([1, 2, 3, 4, 5])->pop(2); // collect([4, 5])

実務例:末尾 N 件をアーカイブ用に分離

<?php

use Illuminate\Support\Collection;

$logs = collect($repository->fetchDailyLogs()); // 古い→新しいの順で格納済み

// 末尾 100 件をアーカイブ、残りは画面表示用に
$archive = $logs->pop(100);          // 新しい Collection(末尾100件)
$repository->storeArchive($archive);  // 保存処理

// $logs にはそれ以外のログが残る
return view('logs.index', ['logs' => $logs]);

よくある落とし穴・注意

  • 元を壊すpop は破壊的。後続で同じコレクションを使い回すなら、先に clone 相当の collect($collection->all())->values() で複製を検討。
  • チェーン途切れpop()(単一)は値を返すため、続けて ->map() などは呼べない。複数取り出したいなら pop(n) を使う。
  • LazyCollection には無い:ストリーム処理中は last()take()(必要に応じて collect() で実体化)を使う。
  • ソートと「末尾」sortBy() 後は並び替えた順の末尾が取り出される。キーは保持される点も踏まえて設計する。

代替・関連APIとの比較

  • last():末尾要素を参照するだけ(非破壊)。「見るだけ」はこれ。
  • take(-n) / slice(-n):末尾 n 件を取得(非破壊)。元は変更しない。
  • shift():先頭から取り出して削除(破壊的)。pop の逆。
  • pull($key) / forget($key):キー指定で削除。末尾とは無関係のピンポイント除去に。

選定基準

  • 元を壊したくない → last() / take(-n) / slice(-n)
  • 末尾から実際に取り除きたい → pop() / pop(n)
  • 先頭側で同様のことをしたい → shift() / shift(n)
  • キーで消したい → pull() / forget()

テスト例(Pest)

<?php

use Illuminate\Support\Collection;

it('pops last item and shortens the collection', function () {
    $c = collect([1, 2, 3]);
    expect($c->pop())->toBe(3);
    expect($c->all())->toBe([1, 2]);
});

it('pops last n items as a collection and keeps keys', function () {
    $c = collect(['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4]);
    $tail = $c->pop(2);

    expect($tail->all())->toBe(['c' => 3, 'd' => 4]);
    expect($c->all())->toBe(['a' => 1, 'b' => 2]);
});

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

症状/エラー原因対処
Call to undefined method LazyCollection::pop()LazyCollection には pop がない->collect()->pop() で実体化してから使う/非破壊なら last() を検討
map() などが続けて呼べないpop()(単一)は値を返すためチェーンが切れる複数必要なら pop(n) を使い、返ってきた Collection にチェーンする
取り出すはずの要素が想定と違う事前に sortBy 等で順序が変わっている並び順を確認。必要なら values() で再インデックスや適切なソートを行う

参考リンク

長野県・北アルプス地方在住のフリーランスWebプログラマー。
「落ち着くためのWeb開発」をテーマに、訪れる人が安心して使えるサービスづくりを心がけています。

LaravelやWordPressなどのWebアプリケーション開発を得意とし、技術面の安定性はもちろん、運用後も長く活用できる設計を大切にしています。
静かな山間の暮らしから生まれる視点で、シンプルかつ本質的な解決策をご提案します。

野鳥観察も趣味のひとつで、特にミソサザイ(Wren)に魅力を感じています。
小さな体に反して力強く上向きの尾羽、そして澄んだ鳴き声が遠くまで響く姿に、静かな存在感と芯の強さを感じます。
このサイト名「Laravel Wren」には、そんなミソサザイのように、小さくても確かな価値を届けたいという想いを込めています。

信頼できるパートナーとして、そして気軽に相談できる存在として、あなたのWebプロジェクトをサポートします。

Yudai Tsuyuzakiをフォローする