Laravel 系列 - 3: Array 與 Collection

更新於 發佈於 閱讀時間約 1 分鐘

對許多初學者來說,「PHP 中的 Array」和「Laravel 中的 Collection」這兩者的差異可能不是那麼明顯。這篇文章將帶大家一探究竟,介紹這兩者的不同點,以及各自的優缺點。

Array

在 PHP 中,Array 是一種原生的資料結構,實際上它並不算是一個物件類型,而是一種儲存資料的方式,可以包含數字索引或關聯索引的元素。PHP 提供了許多內建的函數來操作 Array,像是 array_map()array_filter() 等等。

最主要的優點是,因為是 PHP 原生的功能,所以不論在哪個框架、甚至是純 PHP 程式都可以使用 Array。

Collection

在 Laravel 中,Collection 是一個強大的資料處理工具,它是基於 PHP Array 之上進行擴展的。Laravel 提供了許多便捷的 Collection 方法,像是 map()filter()reduce() 等等,可以幫助高效地處理資料,但缺點是一定得用 Laravel 框架。

兩者間的差異

除了前面提到的原生與框架依賴的差別,以下是 Array 與 Collection 之間的其他主要區別:

  • 本質不同
    Array 僅是一種基本的資料結構,通常用來儲存一組數據。而 Collection 則可以視為一個擁有方法的物件,並且支持封裝、繼承等物件導向特性,讓它在處理複雜資料時更具彈性與擴展性。
  • 方法連鎖(Method Chaining)
    由於 Array 是 PHP 的原生資料結構,它的操作方法是分開的,無法進行鏈式呼叫(Method Chaining),每次呼叫都需要依序處理。例如,操作 Array 時可能需要寫成:$result = array_filter(array_map(...));
    Collection 則可以鏈式呼叫多個方法,讓程式碼更加簡潔與易讀。例如,對一個 Collection 使用多個方法時,可以這樣寫:$collection->filter(...)->map(...)->sort(...);
    這樣的寫法讓程式碼更具可讀性,也更容易維護。
  • 高階方法
    Collection 提供了許多高階方法,這些方法使得程式碼更加簡潔並提升開發效率。例如,若需要取得資料集的第一筆資料,使用 Collection 可以直接寫:$firstItem = $collection->head();
    相對而言,對於原生的 Array,則需要更多的程式碼來實現相同的功能,可能要用 reset($array)array_slice($array, 0, 1) 來取出第一筆資料。
  • Eloquent 互動
    Collection 在 Laravel 中有與 Eloquent 查詢結果集成的特性。這意味著,從 Eloquent 查詢結果取得的資料就是一個 Collection,你可以直接在查詢結果上鏈式呼叫 Collection 方法來進行處理。例如:
    $users = User::where('active', 1)->get(); // 返回 Collection
    $names = $users->pluck('name');
    這種集成性使得操作查詢結果變得更加靈活且直觀。

整體來說,雖然 Collection 因為有許多高階方法讓使用上更方便,但其實使用後的效能不一定更好。在一些僅需要小數據的操作時,或許 Array 才是使用上比較好的選擇喔。

collect()的用法

Collection 本身可以直接帶入 Array 的資料進行建立。

$a = ['key' => 'value'];
$ac = collect($a); // 會建立 'key' => 'value' 的 Collection

此時,你需要確認帶入的 Array 是否為空,以及你想要什麼結果。

$b = [];
$bc1 = collect($a); // 返回一個空的 Collection,內部無元素,通過 isEmpty() 確認為 true
$bc2 = collect([$a]); //返回一個包含一個空数组的 Collection,内部有一個元素

同理,處理空類別的方式也是同樣的方式。

Class myClass {
public string $name;
public string $value;
}

$cc1 = collect(myClass::empty()); // 會解離每一個屬性包成 Array,不再擁有 myClass 這個類別
dump($cc1);
/*
....Illuminate\\Support\\Collection^ {
#items: array:6 [
"\\x00App\\myClass\\x00name" => ""
"\\x00App\\myClass\\x00email" => ""
"\\x00App\\ValueObjects\\Csr\\CsrEmployee\\x00value" => ""
]
#escapeWhenCastingToString: false
}
*/

$cc2 = collect([myClass::empty()]); // 保有 myClass 這個類別,直接視為一整個物件
dump($cc2);
/*
....Illuminate\\Support\\Collection^ {
#items: array:1 [
0 => App\\myClass^ {
-name: ""
-value: ""
}
]
#escapeWhenCastingToString: false
}
*/

由以上可以發現不同代入方式會取得不同的結果,要特別注意

用 map 去調整組成 Collection 的內容

有時候雖然 Array 中擁有所有必要的資訊,但直接塞入 Collection 並非最理想的結果,我們可能會希望先做些調整與計算再塞入 Collection ,此時就可以搭配 map 作使用。

舉例來說,如果我們想改變 Collection 內儲存的結構,可以作如下的調整:

$a = collect($rawData)
->map(
function (array $data) {
$b = $data['one'] + $data['two'];
$c = $data['msg'] ?? '';
return new OtherCalss(
$b,
$c,
Type::from($data['type']),
Carbon::parse($data['now']),
null,
collect(),
);
});


這次就介紹到這邊,我們下次再見!

avatar-img
2會員
36內容數
test
留言
avatar-img
留言分享你的想法!
林柏宇的沙龍 的其他內容
本文介紹如何在 Laravel 中建立與操作資料庫模型,以及如何有效解決 N + 1 問題等。透過使用 Laravel 的 Eloquent ORM,開發者可以簡化資料庫操作,提高程式的可維護性與性能,是學習 Laravel 的開發者不可錯過的參考資料。
本篇文章介紹了Laravel這個開源PHP框架,重點解析其MVC架構及相關功能,包括中介層、服務層、數據傳輸對象(DTO)與值對象(VO)。Laravel的穩定性與擴展性使其成為臺灣許多企業的首選框架,並提供升級與編碼風格的資源參考,適合所有PHP開發者瞭解和掌握。
本文探討控制反轉(IoC)和依賴注入的設計原則,解釋如何利用這些理念降低程式碼的耦合度,提高可擴展性和測試性。通過案例說明,控制反轉改變了程式控制的方式,並介紹依賴注入的三種注入方式及其在 Laravel 框架中的應用。讀者將能夠理解這些設計原則在實際專案中的重要性。
本文章深入探討物件導向程式設計的三大核心特性,包括封裝、多型和繼承。這些特性對於建立模組化、可擴充以及易於維護的程式架構至關重要。封裝確保資料的隱私和完整性,多型實現靈活的系統設計,繼承則促進程式碼的重用。瞭解這些概念將幫助開發者設計更高效的程式系統。
本文探討物件導向編程及其在面試中常見的必備知識,特別是物件導向與程序導向的基本概念與特性分析。此外,介紹了物件導向的五大原則——SOLID,分別為單一功能原則、開放封閉原則、里氏替換原則、介面隔離原則及依賴反轉原則,重點在於提高程式的維護性與擴展性。這些原則對於現代軟體設計具有重要的指導意義。
本文章詳細介紹了 PHP 的依賴管理工具 Composer 的運作原理,包括如何使用 Composer 進行下載、更新依賴的流程,並提供了在專案中正確運用這個工具的實用建議。透過本文,讀者將能夠更好地理解 Composer 的重要性及其背後的機制,確保專案運行的穩定性。
本文介紹如何在 Laravel 中建立與操作資料庫模型,以及如何有效解決 N + 1 問題等。透過使用 Laravel 的 Eloquent ORM,開發者可以簡化資料庫操作,提高程式的可維護性與性能,是學習 Laravel 的開發者不可錯過的參考資料。
本篇文章介紹了Laravel這個開源PHP框架,重點解析其MVC架構及相關功能,包括中介層、服務層、數據傳輸對象(DTO)與值對象(VO)。Laravel的穩定性與擴展性使其成為臺灣許多企業的首選框架,並提供升級與編碼風格的資源參考,適合所有PHP開發者瞭解和掌握。
本文探討控制反轉(IoC)和依賴注入的設計原則,解釋如何利用這些理念降低程式碼的耦合度,提高可擴展性和測試性。通過案例說明,控制反轉改變了程式控制的方式,並介紹依賴注入的三種注入方式及其在 Laravel 框架中的應用。讀者將能夠理解這些設計原則在實際專案中的重要性。
本文章深入探討物件導向程式設計的三大核心特性,包括封裝、多型和繼承。這些特性對於建立模組化、可擴充以及易於維護的程式架構至關重要。封裝確保資料的隱私和完整性,多型實現靈活的系統設計,繼承則促進程式碼的重用。瞭解這些概念將幫助開發者設計更高效的程式系統。
本文探討物件導向編程及其在面試中常見的必備知識,特別是物件導向與程序導向的基本概念與特性分析。此外,介紹了物件導向的五大原則——SOLID,分別為單一功能原則、開放封閉原則、里氏替換原則、介面隔離原則及依賴反轉原則,重點在於提高程式的維護性與擴展性。這些原則對於現代軟體設計具有重要的指導意義。
本文章詳細介紹了 PHP 的依賴管理工具 Composer 的運作原理,包括如何使用 Composer 進行下載、更新依賴的流程,並提供了在專案中正確運用這個工具的實用建議。透過本文,讀者將能夠更好地理解 Composer 的重要性及其背後的機制,確保專案運行的穩定性。
你可能也想看
Google News 追蹤
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
在本節中,我們介紹了PHP的基本語法,包括如何在HTML中嵌入PHP代碼,PHP腳本的執行順序,以及多種註解方式。我們還學習了如何定義和使用變數,包括單個變數和多個變數的賦值方法。這些基礎知識將幫助你開始使用PHP進行Web開發。
Thumbnail
這個章節介紹了PHP的基本特性和應用領域,並且列舉了使用PHP的知名公司和網站。了解PHP的簡單易學、跨平台、嵌入HTML等特性,以及PHP在動態網站、電子商務、內容管理系統、社交媒體平台、數據庫管理和API開發中的應用。
Thumbnail
從基本的OOP概念、PHP基礎回顧,到類別與物件的深入探討、進階概念如繼承、介面與抽象類別,再到實戰應用與設計模式入門,最後以課程總結與未來學習資源提供作結。此課程架構確保學生能夠從基礎到進階,全面掌握PHP物件導向程式設計的核心概念與技術。
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
前置: Factory & UserRepository 在開始實作資料庫測試之前,先與大家介紹 Factory 這個東西。 Factory 是個 Laravel 的 ORM:Eloquent 提供的功能,它可以讓我們用很簡單的方式,去準備測試資料,在 Laravel 初始化後,預設已經幫我們準
今天會再與大家介紹幾個資料庫 Assertion 函數,與陣列 Assertion 函數。 與前一篇一樣,以下會提到的資料庫 Assertion 函數,並非 PHPUnit 內建,而是由 Laravel 所擴充,因此需注意是否有確實引用到 use Tests\\TestCase 。最後面介紹的2個
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
在本節中,我們介紹了PHP的基本語法,包括如何在HTML中嵌入PHP代碼,PHP腳本的執行順序,以及多種註解方式。我們還學習了如何定義和使用變數,包括單個變數和多個變數的賦值方法。這些基礎知識將幫助你開始使用PHP進行Web開發。
Thumbnail
這個章節介紹了PHP的基本特性和應用領域,並且列舉了使用PHP的知名公司和網站。了解PHP的簡單易學、跨平台、嵌入HTML等特性,以及PHP在動態網站、電子商務、內容管理系統、社交媒體平台、數據庫管理和API開發中的應用。
Thumbnail
從基本的OOP概念、PHP基礎回顧,到類別與物件的深入探討、進階概念如繼承、介面與抽象類別,再到實戰應用與設計模式入門,最後以課程總結與未來學習資源提供作結。此課程架構確保學生能夠從基礎到進階,全面掌握PHP物件導向程式設計的核心概念與技術。
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
前置: Factory & UserRepository 在開始實作資料庫測試之前,先與大家介紹 Factory 這個東西。 Factory 是個 Laravel 的 ORM:Eloquent 提供的功能,它可以讓我們用很簡單的方式,去準備測試資料,在 Laravel 初始化後,預設已經幫我們準
今天會再與大家介紹幾個資料庫 Assertion 函數,與陣列 Assertion 函數。 與前一篇一樣,以下會提到的資料庫 Assertion 函數,並非 PHPUnit 內建,而是由 Laravel 所擴充,因此需注意是否有確實引用到 use Tests\\TestCase 。最後面介紹的2個