集合是什麼
Illuminate\Support\Collection 類別是操作陣列資料的流暢包裝器。
比起分別呼叫 PHP 標準的陣列函式,你可以透過方法鏈直觀地處理資料。
集合是不可變的(immutable)。每個方法都不會變更原本的集合,而是回傳新的集合實例。你可以在保留原始資料的同時安全地操作。
建立集合
collect() 輔助函式
最常用的方式。傳入陣列即可生成集合。
Collection::make()
與 collect() 效果相同。若想以 Facade 風格書寫時可以使用。
Collection::fromJson()
從 JSON 字串建立集合。處理外部 API 回應時很方便。
常用方法
map — 轉換每個元素
對集合中的每個元素套用處理,回傳轉換後的新集合。
filter / reject — 依條件篩選
filter() 只保留符合條件的元素,reject() 則排除符合條件的元素。
first / last — 取得一筆元素
回傳符合條件的第一個或最後一個元素。
pluck — 只取出特定 key 的值
從巢狀陣列或模型中僅擷取特定欄位。
groupBy — 依特定 key 分組
sortBy / sortByDesc — 排序
each — 對每個元素執行處理
用於帶有副作用的處理(日誌輸出、寄信等)。它本身不會修改集合。
flatMap — 映射後扁平化一層
將每個元素轉為陣列,並將整體扁平化為一維。
reduce — 匯總
將整個集合摺疊為單一值。
reduceInto — 匯總到物件中
與 reduce 類似進行摺疊處理,但差別在於 callback 不需回傳值。適合直接修改既有的物件。
&)。
chunk — 分割
將較大的集合切割為指定大小。適合批次處理或畫面顯示。
chunkBy — 依相鄰的值分組分割
chunkBy 會將指定 key 或 callback 的值相同且「相鄰」的元素分為一組,分割成多個較小的集合。例如,可將擁有相同父項的相鄰商品分為一組。
groupBy 不同,即使值相同,只要元素不相鄰就會被分到不同的 chunk。
方法鏈
集合真正的價值在於方法鏈。你可以串接多個操作,把複雜的資料轉換用一個表達式表達出來。與 Eloquent 結合
Eloquent 查詢的結果永遠是Illuminate\Database\Eloquent\Collection 實例。
它繼承了基本的 Collection,因此可以完整使用上述方法。
Eloquent 專屬的集合方法
Eloquent\Collection 提供額外的方法。
Lazy Collection
一般的集合會把全部資料讀入記憶體,而LazyCollection 利用 PHP 的 generator,逐筆處理資料。
處理數萬筆以上的大量資料時可節省記憶體。
建立 LazyCollection
大量資料的批次處理
cursor() 會從資料庫逐筆抓取,處理大量紀錄時能大幅節省記憶體。但資料庫連線會維持到處理完成為止。使用 take 與 skip 進行分頁
總結
常用方法整理
常用方法整理
集合 vs 陣列函式
集合 vs 陣列函式
集合比陣列函式擁有更高的可讀性。
一般集合 vs LazyCollection
一般集合 vs LazyCollection
- 一般集合:數百至數千筆資料。單純且直覺。
- LazyCollection:數萬筆以上大量資料,需節省記憶體時使用。搭配
cursor()效果最佳。 - Eloquent 的
get()回傳一般集合,cursor()回傳 LazyCollection。