iT邦幫忙

2024 iThome 鐵人賽

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

後端小白自學 Laravel系列 第 7

第 7 天:集合 - 基礎概念

  • 分享至 

  • xImage
  •  

介紹集合類(Illuminate\Support\Collection)


集合是一種 PHP 陣列的包裝器,提供了許多便捷的方法來操作和處理數據;Laravel 的集合類提供了一種簡單且直觀的方式來操作資料集。
我們可以把集合想像成一個高級的陣列,內建許多實用的方法,讓使用者對資料進行各種操作,而不用寫大量的循環和條件判斷。

創建和操作集合


創建集合
使用 collect 函數創建一個集合:

use Illuminate\Support\Collection;

$numbers = collect([1, 2, 3, 4, 5]);   // 使用 collect 函數創建集合

操作集合

  • 添加元素:
    $numbers->push(6);                 // 將 6 添加到集合的末尾
    
  • 移除元素:
    $numbers->pop();                   // 移除集合末尾的元素
    

常用集合方法(map, filter, reduce, each


map
用途:對集合中的每一個元素執行指定的回調函數,並返回一個新的集合。
範例:將每個數字乘以 2

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

$multiplied = $numbers->map(function ($number) {
    return $number * 2;
});

dd($multiplied);                      // [2, 4, 6, 8, 10]

filter
用途:過濾集合中的元素,只保留符合條件的元素。
範例:只保留大於 3 的數字

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

$greaterThanThree = $numbers->filter(function ($number) {
    return $number > 3;
});

dd($greaterThanThree);                // [4, 5]

reduce
用途:將集合中的所有元素進行累積操作,並返回最終的結果。
範例:計算集合中所有數字的總和

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

$sum = $numbers->reduce(function ($carry, $number) {
    return $carry + $number;
}, 0);

dd($sum);                             // 15

each
用途:對集合中的每一個元素執行指定的回調函數,但不會修改集合本身。
範例:打印集合中的每個數字

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

$numbers->each(function ($number) {
    echo $number . PHP_EOL;
});

pluck
用途:從集合中的每個元素中提取指定的欄位或屬性,並返回一個新的集合,其中包含所有提取的值。
範例:提取每個產品的名稱

$fruits = collect([
    ['id' => 1, 'profile' => ['tag' => 'apple', 'name' => '蘋果']],
    ['id' => 2, 'profile' => ['tag' => 'pineapple', 'name' => '鳳梨']],
    ['id' => 3, 'profile' => ['tag' => 'lemon', 'name' => '檸檬']],
]);

$names = $fruits->pluck('profile.name');
dd($names);

$plucked = $users->pluck('profile.name', 'profile.tag');
dd($plucked);
// $names
Illuminate\Support\Collection {#123
    #items: array:3 [
        0 => "蘋果",
        1 => "鳳梨",
        2 => "檸檬",
    ]
}

// $plucked
Illuminate\Support\Collection {#123
    #items: array:3 [
        "apple" => "蘋果",
        "pineapple" => "鳳梨",
        "lemon" => "檸檬",
    ]
}

✍🏻 每日任務


這是一個從資料庫轉出來的內容是一個 collection,目前用一個變數 $data 裝起來,練習用指定的方法達成需求:

$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],
]);
  1. 使用 map 方法,將每個人的年齡增加 1 年,並輸出修改後的集合。
    $updatedAges = $data->map(function ($item) {
        $item['age'] += 1;
        return $item;
    });
    
    dd($updatedAges->toArray());
    
    $updatedAges = $data->map(fn($user) => [
       ...$user,
       'age' => $user['age'] += 1
    ]);
    
    dd($updatedAges->toArray());
    
  2. 使用 filter 方法,過濾出年齡大於 30 的人,並輸出結果。
    $olderThan30 = $data->filter(function ($item) {
        return $item['age'] > 30;
    });
    
    dd($olderThan30->toArray());
    
    $olderThan30 = $data->filter(fn($user) => $user['age'] > 30);
    
    dd($olderThan30->toArray());
    
  3. 使用 reduce 方法,計算所有人的年齡總和,並輸出結果。
    $totalAge = $data->reduce(function ($carry, $item) {
        return $carry + $item['age'];
    }, 0);
    
    dd("Total Age: $totalAge");
    
    $totalAge = $data->reduce(fn($acc, $cur) => $acc + $cur['age']);
    
    dd("Total Age: $totalAge");
    
  4. 使用 each 方法,遍歷每個人,輸出他們的名字和年齡。
    $data->each(function ($item) {
        echo $item['name'] . ' is ' . $item['age'] . ' years old.' . PHP_EOL;
    });
    
    $data->each(fn($user) => dump("{$user['name']} is {$user['age']} years old."));
    
  5. 使用 pluck 方法,提取所有人的名字,並輸出結果。
    $names = $data->pluck('name');
    
    dd($names->toArray());
    
  6. 使用 sort 方法,按照年齡對人員進行排序,並輸出排序後的集合。
    $sortAge = $data->sortBy('age');
    
    dd($sortAge->toArray());
    
  7. 使用 groupBy 方法:根據年齡段(例如:20-29, 30-39, 40-49)分組人員,並輸出每個分組中的人員。
    $grouped = $data->groupBy(function ($item) {
        $age = $item['age'];
        if ($age >= 20 && $age <= 29) {
            return '20-29';
        } elseif ($age >= 30 && $age <= 39) {
            return '30-39';
        } elseif ($age >= 40 && $age <= 49) {
            return '40-49';
        } else {
            return 'Other';
        }
    });
    
    dd($grouped->toArray());
    

上一篇
第 6 天:數據庫操作基礎
下一篇
第 8 天:集合 - 高級操作
系列文
後端小白自學 Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言