all — コレクションを生配列(array)に取り出す

collection
  • カテゴリ: collection
  • 対応バージョン: Laravel 11・12・PHP 8.2
  • 名前空間 / FQCN / コマンド: Illuminate\Support\Collection::all
  • 関連: toArray / values / collect / Eloquent\Collection / LazyCollection
  • 変更履歴: なし

※指定がなかったため、対応バージョンは既定(Laravel 11・12 / PHP 8.2)で記述。

要点(TL;DR)

  • 何に使うか:コレクション内部の要素をそのままの配列(再帰変換なし・キー保持)で取り出す。
  • 最低限の使い方$array = collect($items)->all();
  • よくある罠
    • all()配列を返すためチェーン不可(->map()等は続けられない)
    • toArray()再帰的に配列化all()は中身(モデル等)をそのまま返す
    • LazyCollectionall()全件を評価してメモリ消費が増える

概要

all()Collection/Eloquent\Collectionの中身をそのままPHP配列として取り出すメソッドです。キーは保持され、要素がモデルやオブジェクトならオブジェクトのまま返ります。配列が必要な外部API・標準関数に渡す際に有用ですが、チェーン処理は途切れるため、後続のコレクション操作が必要ならvalues()やそのままCollectionで扱うのが安全です。

構文 / シグネチャ

/** Get the underlying items as a plain array. */
public function all(): array;

引数(なし)

引数必須既定値説明
なし
  • 戻り値array(キー保持。要素はそのまま)
  • 例外/副作用LazyCollectionでは全要素を評価して配列化(メモリ使用増)。Collectionでは基本O(1)で内部配列を返す。

カテゴリ追記(collection規約)

  • チェーン可否:不可(配列を返す)
  • 破壊的/非破壊:非破壊(元コレクションは変更しない)
  • キー保持:保持する
  • LazyCollection対応:可。ただし全件読み込み
  • 計算量の目安CollectionはO(1)参照、LazyCollectionはO(n)評価

使用例

最小例

use Illuminate\Support\Collection;

$col = collect(['a' => 1, 'b' => 2]);
$array = $col->all();        // ['a' => 1, 'b' => 2]

実務例:Eloquentモデルの配列化の違い

use App\Models\User;

// モデルのコレクション
$users = User::query()->limit(2)->get();

// all(): モデルオブジェクト配列
$asObjects = $users->all();   // [User, User]

// toArray(): 再帰配列(属性配列へ展開)
$asArrays  = $users->toArray(); // [['id'=>..., 'name'=>...], [...]]

// APIに配列を渡す(モデルのまま必要ならall、純配列ならtoArray)
someLibrary($users->all());     // モデル配列を渡す
someApiCall($users->toArray()); // 連想配列を渡す

キーをリセットして配列が欲しい場合

$col = collect(['x' => 10, 'y' => 20]);
$numeric = $col->values()->all(); // [10, 20](キーを0..に振り直し)

LazyCollection注意例(全件読み込み)

use App\Models\Log;

// 大量件数をカーソルでストリーム処理したいのに…
$logs = Log::cursor();     // LazyCollection
$all  = $logs->all();      // ここで全件メモリに載る。避けたい場合は逐次処理にする

よくある落とし穴・注意

  • チェーンが切れる->all()の後に->map()等は使えません(配列にはメソッドがない)。必要ならall()を外すか、collect($array)で再ラップ。
  • toArray()との混同toArray()は再帰的に配列化し、Eloquentモデルは属性配列へ展開。all()素の要素(モデルはモデルのまま)を返す。
  • キー問題:キーを連番にしたいならvalues()->all()を使う。
  • LazyCollectionの全件評価cursor()等の結果でall()はストリーミングの利点を潰す。大量データでは避ける。
  • Model::all()と別物User::all()(全件取得の静的メソッド)とCollection::all()(配列化)は用途が全く違う。

代替・関連APIとの比較

  • toArray():再帰配列化(モデル→属性配列)。外部APIにJSON/配列で渡すならこちらが安全。
  • values():キーを0始まりで振り直したコレクションを返す(チェーン継続可)。
  • collect():配列→コレクションへ再ラップ。all()で配列化した後に再度チェーンしたいときに使用。
  • Eloquent\Collectionall()は同様に配列化するが、中身はModelオブジェクト。

テスト例(Pest)

use App\Models\User;

it('returns underlying array with keys kept', function () {
    $col = collect(['a' => 1, 'b' => 2]);
    $arr = $col->all();

    expect($arr)->toBeArray()
        ->and(array_keys($arr))->toEqual(['a','b']);
});

it('differs from toArray on Eloquent models', function () {
    $users = User::factory()->count(1)->create();
    $all = $users->all();      // [User]
    $arr = $users->toArray();  // [['id'=>..., ...]]

    expect($all[0])->toBeInstanceOf(User::class)
        ->and($arr[0])->toBeArray();
});

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

症状/エラー原因対処
Call to a member function map() on arrayall()で配列化した後にコレクションメソッドを呼んでいるall()を外す/collect($array)->map(...)で再ラップ
メモリ不足(Allowed memory size…)LazyCollectionall()して全件読み込みストリーム処理に徹しeach()/chunk()等を使用
期待と違うJSON出力all()でモデル配列→シリアライズ挙動が想定外toArray()もしくはAPIリソース(Resource)を使用

参考リンク

関連(サイト内)toArray / values / collect / chunk / cursor

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする