集合
是一種 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],
]);
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());
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());
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");
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."));
pluck
方法,提取所有人的名字,並輸出結果。
$names = $data->pluck('name');
dd($names->toArray());
sort
方法,按照年齡對人員進行排序,並輸出排序後的集合。
$sortAge = $data->sortBy('age');
dd($sortAge->toArray());
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());