- カテゴリ: 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)
引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 | 
|---|---|---|---|---|
| $count | int | 1 | 取り出す末尾要素の数。1 なら単一要素を返す。2 以上で新しい Collectionを返す。 | 
- 戻り値:
$count === 1のときは単一要素(mixed)。$count > 1のときは取り出した要素を格納したCollection(元のキーを保持)。 - 例外/副作用:例外は基本なし。元コレクションが短くなる(破壊的)。空コレクションに対しては 
nullを返す。
LazyCollection は非対応(Illuminate\Support\LazyCollectionにpopは存在しない)。 
コレクション特性(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() で再インデックスや適切なソートを行う | 
参考リンク
- Laravel 公式ドキュメント(Collections / 
pop): https://laravel.com/docs/12.x/collections#method-pop - Laravel 公式ドキュメント(
last): https://laravel.com/docs/12.x/collections#method-last - Laravel 公式ドキュメント(
take): https://laravel.com/docs/12.x/collections#method-take - Laravel 公式ドキュメント(
slice): https://laravel.com/docs/12.x/collections#method-slice - Laravel 公式ドキュメント(
shift): https://laravel.com/docs/12.x/collections#method-shift 

  
  
  
  