foreach、array_map 與 Laravel Collection

程式技術
sharkHead

下班滑手機,看到 JetBrains 兼 Laravel 技術傳教士范聖佑大大的社群專頁貼文

文中介紹了 PhpStorm 的套件 Collector,可以將 foreacharray_map 換成 Laravel Collection

Laravel Collection?看起來非常眼熟。

Laravel ORM 中的常常會使用的 get 方法,返回的就是 Collection 實例。

看完貼文,當然就要來測試改寫一下!

於是我使用部落格 Tag 系統中的某段程式碼為例,以三種不一樣的寫法重新改寫看看。

// 將 $tagJson 這個字串轉成 Array
$tagJson = '[{"id":3,"value":"C++"},{"id":4,"value":"CSS"},{"id":6,"value":"Go"}]';
$tags = json_decode($tagJson);

// 使用 print_r($tags) 來看看 $tags 的內容;
// Array
// (
//     [0] => stdClass Object
//         (
//             [id] => 3
//             [value] => C++
//         )

//     [1] => stdClass Object
//         (
//             [id] => 4
//             [value] => CSS
//         )

//     [2] => stdClass Object
//         (
//             [id] => 6
//             [value] => Go
//         )
// )

// 接下來使用三種方式,只取 $tags 中 id 的值,並放入新的陣列 $tagIdArray

// 使用 foreach
$tagIdArray = [];
foreach ($tags as $tag) {
    array_push($tagArray, $tag->id);
}

// 使用 Laravel Collection
$tagIdArray = collect($tags)->map(function ($tag) {
    return $tag->id;
})->all();

// 使用 array_map
$getIdFunc = function ($item) {
    return $item->id;
};
$tagIdArray = array_map($getIdFunc, $tags);

// 上述三種方法,生成的 $tagIdArray 都會一樣,結果如下
// $tagArray = [
//     0 => 3,
//     1 => 4,
//     2 => 6,
// ];

簡單說明 Laravel Collection 這個部分的程式碼做了什麼。

首先是 collect 這個方法,可以將 Array 轉成 Collection 實例。

$collection = collect([1, 2, 3, 4]);

Laravel 的 ORM 查詢返回的結果都是 Collection 實例,例如:

  • Model::all()
  • Model::where('id', 1)→get()

再來是 map 方法,其功用是遍歷 Collection ,並將 Collection 中的每一個值傳入給定的回呼函式 (Callback function),該回呼函式可以任意修改 Collection 裡面的值並返回,生成被修改過的新 Collection

all 方法與 collect 方法相反,是將 Collection 轉成 Array。

$collection = collect([1, 2, 3, 4, 5]);

$newCollection = $collection->map(function ($item, $key) {
	// 將 $collection 裡面的每一個值乘以 2
	return $item * 2;
});

// 將 Collection 物件使用 all 方法轉成 Array
$newCollection->all()
// [2, 4, 6, 8, 5]

Collection 本身有許多好用的方法,用於處理 Array 非常方便,詳細可以參考官方說明文件

sharkHead
written by
sharkHead

後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

1 則留言
sharkHead sharkHead 2021 年 01 月 09 日

Collection 提供的方法非常多,使用起來也很便利 但是沒有必要一定要把程式碼中所有的 foreach 換成 Collection

主要還是根據狀況看使用哪一種比較好~