iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
佛心分享-IT 人自學之術

後端小白自學 Laravel系列 第 8

第 8 天:集合 - 高級操作

  • 分享至 

  • xImage
  •  

鏈式操作集合


鏈式操作允許把多個集合操作串聯在一起,讓代碼更具可讀性和簡潔性,而且這種方式能夠在單個集合對象上進行多次操作。

use Illuminate\Support\Collection;

$data = collect([
    ['id' => 1, 'name' => 'Alice', 'age' => 28],
    ['id' => 2, 'name' => 'Bob', 'age' => 34],
    ['id' => 3, 'name' => 'Charlie', 'age' => 22],
    ['id' => 4, 'name' => 'David', 'age' => 40],
    ['id' => 5, 'name' => 'Eve', 'age' => 29],
]);

$result = $data->filter(function ($item) {
    return $item['age'] > 25;         // 先過濾出年齡大於 25 的人
})->map(function ($item) {
    $item['age'] += 1;                // 每個人的年齡增加 1 年
    return $item;
})->sortBy('age');                    // 根據年齡進行排序

dd($result->toArray());

使用集合進行複雜的數據轉換


有時候需要對集合中的數據進行更複雜的轉換操作,這可能涉及到多層嵌套數據的處理或數據格式的變換。

$data = collect([
    ['id' => 1, 'name' => 'Alice', 'details' => ['color' => 'Red', 'size' => 'M']],
    ['id' => 2, 'name' => 'Bob', 'details' => ['color' => 'Blue', 'size' => 'L']],
    ['id' => 3, 'name' => 'Charlie', 'details' => ['color' => 'Green', 'size' => 'S']],
]);

// 將每個產品的顏色和尺寸合併為一個描述字符串,並返回包含產品名稱和描述的新集合。
$transformed = $data->map(function ($item) {
    return [
        'name' => $item['name'],
        'description' => $item['details']['color'] . ' ' . $item['details']['size']
    ];
});

dd($transformed->toArray());

合併和分組集合


合併集合
merge 方法可以用來將兩個或多個集合合併成一個集合。

$collection1 = collect([1, 2, 3]);
$collection2 = collect([4, 5, 6]);

$merged = $collection1->merge($collection2);

dd($merged->toArray());         //  [1, 2, 3, 4, 5, 6] -> 兩個集合合併成一個新的集合

分組集合
groupBy 方法可以用來根據指定的"鍵"或"條件"將集合中的元素分組。

$data = collect([
    ['id' => 1, 'name' => 'Alice', 'age' => 28],
    ['id' => 2, 'name' => 'Bob', 'age' => 34],
    ['id' => 3, 'name' => 'Charlie', 'age' => 22],
    ['id' => 4, 'name' => 'David', 'age' => 40],
    ['id' => 5, 'name' => 'Eve', 'age' => 29],
]);

// 年齡大於等於 30 歲的放在一組,其他放在另一組
$grouped = $data->groupBy(function ($item) {
    return $item['age'] >= 30 ? '30 and above' : 'Below 30';
});

dd($grouped->toArray());

✍🏻 每日任務:


有一個 collection 型別的變數 $data,練習用指定的方法達成需求:

$data = collect([
    ['id' => 1, 'name' => 'Alice', 'age' => 28, 'city' => 'New York'],
    ['id' => 2, 'name' => 'Bob', 'age' => 34, 'city' => 'Los Angeles'],
    ['id' => 3, 'name' => 'Charlie', 'age' => 22, 'city' => 'Chicago'],
    ['id' => 4, 'name' => 'David', 'age' => 40, 'city' => 'Houston'],
    ['id' => 5, 'name' => 'Eve', 'age' => 29, 'city' => 'New York'],
]);
  1. 鏈式操作:過濾年齡大於 25 歲的項目 -> 將每個人的城市添加到名稱中 -> 根據名稱進行排序。
         $processed  = $data
             ->filter(fn($user) => $user['age'] > 25)
             ->map(fn($user) =>  [
                 ...$user,
                 "name" => "{$user['name']}_{$user['city']}"
             ])
             ->sortBy('name');
    
         dd($processed ->all());
    
  2. 複雜數據轉換:從 $data 中提取每個人的姓名和所在城市,並將城市簡化為縮寫(例如:New York 縮寫為 NY)。
         $cityAbbreviations = [
             'New York'    => 'NY',
             'Los Angeles' => 'LA',
             'Chicago'     => 'CHI',
             'Houston'     => 'HOU',
         ];
    
         $transformed = $data->map(fn($user) => [
             'name' => $user['name'],
             'city' => $cityAbbreviations[$user['city']] ?? $user['city']
         ]);
    
         dd($transformed->all());
    
  3. 合併和分組:創建另一個集合 $additionalData,包含一些附加信息。
       $additionalData = collect([
        ['id' => 6, 'name' => 'Frank', 'age' => 33, 'city' => 'Chicago'],
        ['id' => 7, 'name' => 'Grace', 'age' => 45, 'city' => 'Los Angeles'],
       ]);
    
    • 使用 merge 方法將 $additionalData 合併到 $data 集合中。
    $merged = $data->merge($additionalData);
    
    • 使用 groupBy 方法,根據城市將合併後的集合分組。
    $grouped = $data->merge($additionalData)->groupBy('city');
    

上一篇
第 7 天:集合 - 基礎概念
下一篇
第 9 天:表單處理與請求
系列文
後端小白自學 Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言