- カテゴリ: collection
 - 掲載バージョン: Laravel 12・PHP 8.4
 - 名前空間 / FQCN / コマンド: 
Illuminate\Support\Collection::shift - 関連: pop / first / slice / splice / pull
 - 変更履歴: Laravel 6で
LazyCollection導入(shiftは非対応)。(readouble.com) 
要点(TL;DR)
- コレクションの先頭要素を取り出しつつ消すために使う
 collect([1,2,3])->shift()- 破壊的/戻り値は要素(空なら
null)。数値キーは詰められる(再インデックス)。(Laravel, php.net) 
概要
shiftはコレクションの先頭から1件を取り出して返し, その要素を元コレクションから削除します。スタック/キューの「デキュー」に相当し、CSV先頭行(ヘッダー)の取り出しなどで使います。EloquentコレクションもベースのコレクションAPIを継承しているため同様に利用できます。(Laravel)
構文 / シグネチャ
mixed|null Collection::shift()
- 引数(表) 引数 型 必須 既定値 説明 なし — — — —
 - 戻り値:取り出した要素(空の場合は
null)(Laravel) - 例外/副作用:破壊的(元のコレクションから要素を削除)。数値キーは再インデックスされる(PHPの
array_shiftに準拠)。(php.net) 
コレクション固有メモ
- チェーン可否:不可(要素を返すため)。
 - キー保持:連想キーは残るが、数値キーは詰め直し。(php.net)
 - LazyCollection対応:非対応(ミューテート系は未実装)。(readouble.com)
 - 計算量の目安:数値キーの再インデックスによりおおむね O(n)。
 
使用例
最小例
use Illuminate\Support\Collection;
$items = collect([10, 20, 30]);
$first = $items->shift(); // 10
// $items は [20, 30]
実務例:CSVのヘッダー行を剥がす
use Illuminate\Support\Collection;
$csv = "name,email\nAlice,alice@example.com\nBob,bob@example.com";
$rows = collect(explode("\n", trim($csv)));
$header = str_getcsv($rows->shift()); // ["name","email"]
$data   = $rows->map(fn($line) => array_combine($header, str_getcsv($line)));
// $data->all():
// [
//   ["name"=>"Alice","email"=>"alice@example.com"],
//   ["name"=>"Bob","email"=>"bob@example.com"],
// ]
よくある落とし穴・注意
- **空コレクションで
null**を返す → 直後にメソッド呼び出しでエラーになりがち(if (is_null($x))等でガード)。(Laravel) - 数値キーが詰められる → インデックスを参照しているコードは想定ずれに注意。(php.net)
 - ループで多用すると遅い:先頭削除は都度再インデックスされるため、巨大配列で
while($c->isNotEmpty()) $c->shift();は非効率。必要ならイテレーションや**イミュータブルなslice**等を検討。 
代替・関連APIとの比較
first():非破壊で先頭要素を見るだけ。手元に残すならこちら。slice(1)/skip(1):非破壊で「先頭を除いた残り」を得る。splice(0, 1):破壊的に先頭要素を切り出し、取り出した要素コレクションを返す(要素と残りの両方が必要なときに有効)。pop():末尾から取り出す(スタック)。pull($key):キー指定で取り出して削除。(Laravel)
テスト例(Pest)
use Illuminate\Support\Collection;
it('takes and removes the first item', function () {
    $c = collect([1, 2, 3]);
    expect($c->shift())->toBe(1);
    expect($c->all())->toBe([2, 3]);
});
it('returns null when empty', function () {
    $c = collect();
    expect($c->shift())->toBeNull();
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 | 
|---|---|---|
Call to a member function ... on null | 空コレクションでshift()し、その戻り値(null)にメソッド呼び出し | 事前ガード(if ($x === null) ...)またはfirst()で非破壊に参照 | 
| 期待と違うインデックス | 数値キーが詰められた | values()で明示リセットするか、元からインデックス参照を避ける | 
| 想定より遅い | ループ内shift()で毎回再インデックス | 反復処理(foreach)やslice/skipへ置換 | 
collectionカテゴリの追記
- チェーン可否:不可(要素を返す)
 - 破壊的/非破壊:破壊的
 - キー保持:連想キーは保持、数値キーは再インデックス
 - LazyCollection:不可(ミューテート系未実装)(readouble.com)
 - 計算量:先頭削除で再インデックスが走るため概ね O(n)
 - 入出力例:
collect([10=> 'a', 11=>'b'])->shift()→'a'/残りは[11=>'b'](連想キーは維持) /collect([0=>'a',2=>'b'])->shift()→'a'/残りは[0=>'b'](数値キー詰め)(php.net) 
以上。用途が「ヘッダー剥がし」「簡易キュー」ならshift、閲覧だけならfirst()、残りを得たいならslice/skipを基準に選定してください。
参考リンク
- Laravel公式ドキュメント:Collections(メソッド一覧)(Laravel)
 - Laravel公式ドキュメント:Eloquent Collections(ベース継承の説明)(Laravel)
 - Readouble(Laravel 6.x):LazyCollectionは
shift非対応の注記(readouble.com) - Readouble(Laravel 5.x):
shiftの基本動作(先頭を取り出して削除)(Laravel) - PHP公式:
array_shift(数値キーの再インデックス仕様)(php.net) 

  
  
  
  