collapse — 配列の一次元結合(コレクションの配列要素をフラット化)

collection
  • カテゴリ: collection
  • 対応バージョン: Laravel 12・PHP 8.2
  • 名前空間 / FQCN / コマンド: Illuminate\Support\Collection::collapse
  • 関連: flatten / flatMap / concat / merge / pluck
  • 変更履歴: ─

要点(TL;DR)

  • 何に使うか:配列(やコレクション)を要素に持つコレクションを、1段だけフラットなコレクションへ結合する
  • 最低限の使い方collect([[1,2],[3,4]])->collapse()
  • よくある罠
    • 配列以外の要素は無視される(文字列・数値だけの要素は結果に含まれない)
    • 文字列キーは後勝ちで上書き、数値キーは再インデックス
    • 深いネストは解消しない(1段のみ)。再帰的にはflatten()を使う

概要

collapse()は「配列(またはコレクション)の集合」を1つの平坦なリストへ結合します。APIレスポンスでページごとにitemsが分かれている、pluck()で属性配列の配列になった、といった場面で後処理を簡潔にします。返り値は新しいコレクションで、元のデータは変更しません。

構文 / シグネチャ

// Illuminate\Support\Collection
public function collapse(): static;

引数(表)

引数必須既定値説明
なしいいえ要素は配列またはコレクションであること
  • 戻り値Collection(1段フラット化された要素列)
  • 例外/副作用
    • 非配列・非コレクション要素は無視される
    • 数値キーは再インデックス、文字列キーは後勝ちで上書き

使用例

最小例

<?php

use Illuminate\Support\Collection;

$collapsed = collect([[1, 2, 3], [4, 5], [6]])
    ->collapse();

$collapsed->all(); // [1, 2, 3, 4, 5, 6]

実務例

投稿のタグ配列(配列の配列)を1本化してユニーク化

<?php

use Illuminate\Support\Collection;

/** @var \Illuminate\Support\Collection $posts */
// $posts = collect([['tags' => ['php','laravel']], ['tags' => ['php','collection']]]);

$uniqueTags = $posts
    ->pluck('tags')        // => Collection([['php','laravel'], ['php','collection']])
    ->collapse()           // => Collection(['php','laravel','php','collection'])
    ->unique()
    ->values();            // => Collection(['php','laravel','collection'])

ページングAPIのitemsを一括結合

<?php

$responses = collect([
    ['items' => [['id'=>1], ['id'=>2]]],
    ['items' => [['id'=>3]]],
    ['items' => []],
]);

$allItems = $responses->pluck('items')->collapse(); // [['id'=>1], ['id'=>2], ['id'=>3]]

よくある落とし穴・注意

  • 1段のみ[[1,[2,3]],[4]]collapse()後は [1, [2,3], 4]。深いネストを解消したいならflatten()(必要ならflatten($depth)で段数指定)。
  • キーの扱い
    • 数値キー:0から振り直し
    • 文字列キー:同一キーは後勝ち(前の値が上書きされる)
  • 要素型の制約:要素が配列/コレクション以外(例:'foo')は結果に含まれない。そうした要素も並べたいならflatten()を検討。
  • パフォーマンス:総要素数に対してO(n)。大きなストリームを扱うならLazyCollectionでも利用可能(遅延評価でメモリ節約)。

代替・関連APIとの比較

  • flatten($depth = INF):再帰的に多段ネストを平坦化。配列以外の要素も対象。多段ならこちら
  • flatMap($callback):各要素を配列(またはコレクション)へ変換→即collapseまで一気に行う。「変換しながら結合」するなら最短。
  • concat($items):末尾にシーケンスを連結。入れ子を見ない
  • merge($items):配列/コレクションを1回マージ。**「配列の配列」ではなく、**単に2つを合わせたい時に。

テスト例(Pest)

<?php

use Illuminate\Support\Collection;

it('collapses one level and reindexes numeric keys', function () {
    $c = collect([[10 => 'a', 'b'], ['c']])->collapse();
    expect($c->all())->toBe(['a', 'b', 'c']);
});

it('ignores non-array items', function () {
    $c = collect([[1,2], 'x', collect([3])])->collapse();
    expect($c->all())->toBe([1,2,3]);
});

it('overwrites duplicate string keys (last wins)', function () {
    $c = collect([['k' => 1], ['k' => 2]])->collapse();
    expect($c->all())->toBe(['k' => 2]);
});

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

症状/エラー原因対処
Call to a member function collapse() on array生配列に対して呼び出しているcollect($array)->collapse() に変える
期待より深くフラット化されないcollapse()は1段のみflatten()flatMap()を使用
値が欠落している/上書きされる文字列キーが重複し後勝ちで上書きキーを数値化してから結合、またはflatMapで配列の形を調整
文字列等が結果に出てこない非配列要素は無視すべて配列化する、またはflatten()を使う

参考リンク

代替・関連APIとの比較(クイックガイド)

  • flatten:多段ネストを解消したい
  • flatMap:変換+結合を一度にやりたい
  • concat:ただ後ろに繋げたい
  • merge:2つの配列/コレクションを統合したい

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

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

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

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

Yudai Tsuyuzakiをフォローする