Skip to main content

集合是什麼

Illuminate\Support\Collection 類別是操作陣列資料的流暢包裝器。 比起分別呼叫 PHP 標準的陣列函式,你可以透過方法鏈直觀地處理資料。
集合是不可變的(immutable)。每個方法都不會變更原本的集合,而是回傳新的集合實例。你可以在保留原始資料的同時安全地操作。

建立集合

collect() 輔助函式

最常用的方式。傳入陣列即可生成集合。

Collection::make()

collect() 效果相同。若想以 Facade 風格書寫時可以使用。

Collection::fromJson()

從 JSON 字串建立集合。處理外部 API 回應時很方便。

常用方法

map — 轉換每個元素

對集合中的每個元素套用處理,回傳轉換後的新集合。

filter / reject — 依條件篩選

filter() 只保留符合條件的元素,reject() 則排除符合條件的元素。
執行 filter() 之後索引會出現空缺。呼叫 values() 便可重新編為從 0 開始的連續索引。

first / last — 取得一筆元素

回傳符合條件的第一個或最後一個元素。

pluck — 只取出特定 key 的值

從巢狀陣列或模型中僅擷取特定欄位。

groupBy — 依特定 key 分組

sortBy / sortByDesc — 排序

each — 對每個元素執行處理

用於帶有副作用的處理(日誌輸出、寄信等)。它本身不會修改集合。

flatMap — 映射後扁平化一層

將每個元素轉為陣列,並將整體扁平化為一維。

reduce — 匯總

將整個集合摺疊為單一值。
單純加總可以使用 sum()$orders->sum(fn ($o) => $o['price'] * $o['quantity'])

reduceInto — 匯總到物件中

reduce 類似進行摺疊處理,但差別在於 callback 不需回傳值。適合直接修改既有的物件。
reduce 的 callback 回傳值會成為下一次的 $carry,適合基本型別的匯總。reduceInto 則會持續修改同一個物件,程式碼可以更精簡。
若要匯總為純量或陣列,可在 callback 中使用參考傳遞(&)。

chunk — 分割

將較大的集合切割為指定大小。適合批次處理或畫面顯示。

方法鏈

集合真正的價值在於方法鏈。你可以串接多個操作,把複雜的資料轉換用一個表達式表達出來。

與 Eloquent 結合

Eloquent 查詢的結果永遠是 Illuminate\Database\Eloquent\Collection 實例。 它繼承了基本的 Collection,因此可以完整使用上述方法。
資料庫可以處理的篩選或排序,請透過查詢建構器(whereorderBy 等)進行,而非集合操作。若在轉為集合之後才篩選,將把不必要的資料整批讀入記憶體。

Eloquent 專屬的集合方法

Eloquent\Collection 提供額外的方法。

Lazy Collection

一般的集合會把全部資料讀入記憶體,而 LazyCollection 利用 PHP 的 generator,逐筆處理資料。 處理數萬筆以上的大量資料時可節省記憶體。

建立 LazyCollection

大量資料的批次處理

cursor() 會從資料庫逐筆抓取,處理大量紀錄時能大幅節省記憶體。但資料庫連線會維持到處理完成為止。

使用 takeskip 進行分頁

總結

集合比陣列函式擁有更高的可讀性。
  • 一般集合:數百至數千筆資料。單純且直覺。
  • LazyCollection:數萬筆以上大量資料,需節省記憶體時使用。搭配 cursor() 效果最佳。
  • Eloquent 的 get() 回傳一般集合,cursor() 回傳 LazyCollection。
最後修改於 2026年8月2日