foreach、array_map 與 Laravel Collection
下班滑手機,看到 JetBrains 兼 Laravel 技術傳教士范聖佑大大的社群專頁貼文。
文中介紹了 PhpStorm 的套件 Collector,可以將 foreach
、array_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 非常方便,詳細可以參考官方說明文件。