shift — 先頭要素を取り出して削除

collection
  • カテゴリ: 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)

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

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

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

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

Yudai Tsuyuzakiをフォローする