鏈式操作允許把多個集合操作串聯在一起,讓代碼更具可讀性和簡潔性,而且這種方式能夠在單個集合對象上進行多次操作。
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'],
]);
$processed = $data
->filter(fn($user) => $user['age'] > 25)
->map(fn($user) => [
...$user,
"name" => "{$user['name']}_{$user['city']}"
])
->sortBy('name');
dd($processed ->all());
$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());
$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');