集合
簡介
Illuminate\Support\Collection
類別提供了一個更具可讀性和更便於處理陣列資料的封裝。具體例子請查看下面程式碼。我們使用collect
輔助函數從陣列中建立一個新的集合實例,並對其中每一個元素執行strtoupper
函數之後再刪除所有的空元素:
$collection = collect(['taylor', 'abigail', null])->map(function ($name) { return strtoupper($name); })->reject(function ($name) { return empty($name); });
如你所見, Collection
類別允許你鍊式調用其它方法,以達到在底層數組上流暢的執行map 和reduce 操作,通常,集合是不可變的,這意味著每一個Collection
方法都會傳回一個新的Collection
實例。
建立集合
# 如上所述, collect
輔助函數會為指定的陣列傳回一個新的Illuminate\Support\Collection
實例。因此,我們可以這樣輕鬆的創建一個集合:
$collection = collect([1, 2, 3]);
{tip} 通常,Eloquent 查詢的結果傳回的內容都是
Collection
實例。
擴充集合
集合都是「可宏擴充」(macroable) 的,它允許你在執行時將其它方法加入Collection
類別。例如,透過下面的程式碼在 Collection
類別中新增一個 toUpper
方法:
use Illuminate\Support\Str;Collection::macro('toUpper', function () { return $this->map(function ($value) { return Str::upper($value); }); });$collection = collect(['first', 'second']); $upper = $collection->toUpper(); // ['FIRST', 'SECOND']
通常,你應該在 服務提供者 內宣告集合巨集。
可用方法
接下來的文件內容,我們會探討 Collection
類別的每個方法。請牢記,所有方法都可以透過鍊式存取的形式優雅的操作數組。而且,幾乎所有的方法都會傳回一個新的 Collection
實例,讓你在必要時保存集合的原始副本:
##全部
#平均##平均
崩潰
##組合
#concat
##contains
#containsStrict
count ##crossJoin
#dd
##diff
#diffAssoc
diffKeys
##dump##each
##eachSpread
##每個
除了 ##過濾器
##first
##firstWhere##flatMap
#flatten
##翻轉
##忘記##forPage
get
#groupBy
##有
##內爆
#intersect
##intersectByKeys
isEmpty ##isNotEmpty
#keyBy
##keys
last
##巨集
make##map
##mapInto
mapSpread
mapToGroups
mapWithKeys
##max##median
merge
#min
#模式
#nth
##only##pad
分區
##管道
## pluck##pop
##prepend
#pull
##推
#隨機
##減少
#拒絕
反向
#搜尋
移位
隨機播放
切片
一些
排序
#排序#########排序########sortKeys
sortKeysDesc
#splice
split
sum
#take
tap
times
#toArray
##toJson
#transform
union
unique
#uniqueStrict
##unless
##unlessEmpty
unlessNotEmpty
#unwrap
values
##when
whenEmpty
whereInStrict
whereInstanceOfwhereNotBetween
collect([1, 2, 3])->all();// [1, 2, 3]#########################average()################################################# #######avg###### 方法的別名。 ###########################avg()############avg### 方法傳回給定鍵的###平均值### :###
$average = collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->avg('foo'); // 20 $average = collect([1, 1, 2, 4])->avg(); // 2########################chunk()######## ####chunk### 方法將集合拆成多個給定大小的小集合:###
$collection = collect([1, 2, 3, 4, 5, 6, 7]); $chunks = $collection->chunk(4); $chunks->toArray(); // [[1, 2, 3, 4], [5, 6, 7]]###這個方法在使用網格系統的視圖中特別適用,例如###Bootstrap### 。想像你有一個Eloquent 模型的集合要在網格中顯示:###
@foreach ($products->chunk(3) as $chunk) <div class="row"> @foreach ($chunk as $product) <div class="col-xs-4"> {{ $product->name }} </div> @endforeach </div> @endforeach########################collapse()#### ########collapse### 方法將多個陣列的集合合併成一個陣列的集合:###
$collection = collect([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); $collapsed = $collection->collapse(); $collapsed->all(); // [1, 2, 3, 4, 5, 6, 7, 8, 9]##################
combine()
combine
方法可以將一個集合的值作為鍵,再將另一個陣列或集合的值作為值合併成一個集合:
$collection = collect(['name', 'age']); $combined = $collection->combine(['George', 29]); $combined->all(); // ['name' => 'George', 'age' => 29]
#concat()
concat
方法將給定的陣列
或集合值追加到集合的結尾:
$collection = collect(['John Doe']); $concatenated = $collection->concat(['Jane Doe'])->concat(['name' => 'Johnny Doe']); $concatenated->all(); // ['John Doe', 'Jane Doe', 'Johnny Doe']
contains()
contains
方法判斷集合是否包含指定的集合項目:
$collection = collect(['name' => 'Desk', 'price' => 100]); $collection->contains('Desk'); // true $collection->contains('New York'); // false
你也可以使用contains
方法傳遞一組鍵/值對,可以判斷該鍵/ 值對是否存在於集合中:
$collection = collect([ ['product' => 'Desk', 'price' => 200], ['product' => 'Chair', 'price' => 100], ]); $collection->contains('product', 'Bookcase'); // false
最後,你也可以用contains
方法傳遞一個回呼函數來執行自己的真實測試:
$collection = collect([1, 2, 3, 4, 5]); $collection->contains(function ($value, $key) { return $value > 5; }); // false
contains
方法在檢查集合項目的值時使用「寬鬆」比較,這表示具有整數值的字串將被視為等於相同值的整數。相反 containsStrict
方法則是使用「嚴格」比較來篩選。
containsStrict()
這個方法和contains
方法類似,但是它卻是使用了「嚴格」比較來比較所有的值。
count()
count
$collection = collect([1, 2, 3, 4]);
$collection->count();
// 4
$collection = collect([1, 2]);
$matrix = $collection->crossJoin(['a', 'b']);
$matrix->all();
/*
[
[1, 'a'],
[1, 'b'],
[2, 'a'],
[2, 'b'],
]
*/
$collection = collect([1, 2]);
$matrix = $collection->crossJoin(['a', 'b'], ['I', 'II']);
$matrix->all();
/*
[
[1, 'a', 'I'],
[1, 'a', 'II'],
[1, 'b', 'I'],
[1, 'b', 'II'],
[2, 'a', 'I'],
[2, 'a', 'II'],
[2, 'b', 'I'],
[2, 'b', 'II'],
]
*/
dd()
$collection = collect(['John Doe', 'Jane Doe']); $collection->dd(); /* Collection { #items: array:2 [ 0 => "John Doe" 1 => "Jane Doe" ] } */
dump
方法代替。 $collection = collect([1, 2, 3, 4, 5]); $diff = $collection->diff([2, 4, 6, 8]); $diff->all(); // [1, 3, 5]########################diffAssoc()#### ########diffAssoc### 方法與另外一個集合或基於它的鍵和值的PHP ###陣列### 進行比較。這個方法將會傳回原集合不存在於指定集合的鍵 / 值對:###
$collection = collect([ 'color' => 'orange', 'type' => 'fruit', 'remain' => 6 ]); $diff = $collection->diffAssoc([ 'color' => 'yellow', 'type' => 'fruit', 'remain' => 3, 'used' => 6 ]); $diff->all(); // ['color' => 'orange', 'remain' => 6]##################
diffKeys()
diffKeys
方法和另一個集合或PHP 陣列
的鍵進行比較,然後傳回原集合中存在而指定集合中不存在鍵所對應的鍵/ 值對:
$collection = collect([ 'one' => 10, 'two' => 20, 'three' => 30, 'four' => 40, 'five' => 50, ]); $diff = $collection->diffKeys([ 'two' => 2, 'four' => 4, 'six' => 6, 'eight' => 8, ]); $diff->all(); // ['one' => 10, 'three' => 30, 'five' => 50]
dump()
dump
方法用於列印集合項目:
$collection = collect(['John Doe', 'Jane Doe']); $collection->dump(); /* Collection { #items: array:2 [ 0 => "John Doe" 1 => "Jane Doe" ] } */
如果要在列印集合後終止執行腳本,請使用dd
方法代替。
each()
each
方法用於循環集合項目並將其傳遞到回呼函數中:
$collection->each(function ($item, $key) { // });
如果你想中斷對集合項目的循環,那麼就在你的回呼函數中返回false
:
$collection->each(function ($item, $key) { if (/* 某些条件 */ ) { return false; } });
#eachSpread()
#eachSpread
方法用於循環集合項,將每個巢狀集合項目的值傳遞給回呼函數:
$collection = collect([['John Doe', 35], ['Jane Doe', 33]]); $collection->eachSpread(function ($name, $age) { // });
你可以透過在回呼函數裡返回false
來中斷循環:
$collection->eachSpread(function ($name, $age) { return false; });
collect([1, 2, 3, 4])->every(function ($value, $key) {
return $value > 2;
});
// false
如果集合為空,
every
將傳回true:$collection = collect([]); $collection->every(function($value, $key) { return $value > 2; }); // true
方法傳回集合中除了指定鍵之外的所有集合項目:$collection = collect(['product_id' => 1, 'price' => 100, 'discount' => false]); $filtered = $collection->except(['price', 'discount']); $filtered->all(); // ['product_id' => 1]
except 對應的是
only
方法。 $collection = collect([1, 2, 3, 4]); $filtered = $collection->filter(function ($value, $key) { return $value > 2; }); $filtered->all(); // [3, 4]如果沒有提供回呼函數,集合中所有返回false 的元素都會被移除:
$collection = collect([1, 2, 3, null, false, '', 0, []]); $collection->filter()->all(); // [1, 2, 3]
filter 對應的是
reject
方法。 first()
collect([1, 2, 3, 4])->first(function ($value, $key) { return $value > 2; }); // 3
collect([1, 2, 3, 4])->first(); // 1###################
firstWhere()
firstWhere
方法傳回集合中含有指定鍵/ 值對的第一個元素:
$collection = collect([ ['name' => 'Regena', 'age' => null], ['name' => 'Linda', 'age' => 14], ['name' => 'Diego', 'age' => 23], ['name' => 'Linda', 'age' => 84], ]); $collection->firstWhere('name', 'Linda'); // ['name' => 'Linda', 'age' => 14]
你也可以使用運算子來呼叫firstWhere
方法:
$collection->firstWhere('age', '>=', 18); // ['name' => 'Diego', 'age' => 23]
和where 方法一樣,你可以將一個參數傳遞給firstWhere
方法。在這種情況下, firstWhere
方法將傳回指定鍵的值為「真」的第一個集合項目:
$collection->firstWhere('age'); // ['name' => 'Linda', 'age' => 14]
##flatMap()
flatMap 方法遍歷集合並將其中的每個值傳遞到給定的回呼函數。可以透過回呼函數修改集合項並傳回它們,從而形成一個被修改過的新集合。然後,集合轉換的陣列是同級的:
$collection = collect([ ['name' => 'Sally'], ['school' => 'Arkansas'], ['age' => 28] ]); $flattened = $collection->flatMap(function ($values) { return array_map('strtoupper', $values); }); $flattened->all(); // ['name' => 'SALLY', 'school' => 'ARKANSAS', 'age' => '28'];
#flatten()
##flatten 方法將多維集合轉為一維集合:
你可以選擇性地傳入「深度」參數:$collection = collect(['name' => 'taylor', 'languages' => ['php', 'javascript']]);
$flattened = $collection->flatten();
$flattened->all();
// ['taylor', 'php', 'javascript'];
$collection = collect([ 'Apple' => [ ['name' => 'iPhone 6S', 'brand' => 'Apple'], ], 'Samsung' => [ ['name' => 'Galaxy S7', 'brand' => 'Samsung'] ], ]); $products = $collection->flatten(1);$products->values()->all(); /* [ ['name' => 'iPhone 6S', 'brand' => 'Apple'], ['name' => 'Galaxy S7', 'brand' => 'Samsung'], ] */
在這個例子裡,調用
flatten 時不傳入深度參數的話也會將嵌套數組轉成一維的,然後返回['iPhone 6S', 'Apple', 'Galaxy S7', 'Samsung']
。傳入深度參數能讓你限制設定回傳數組的層數。
方法將集合的鍵與對應的值進行互換:$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$flipped = $collection->flip();$flipped->all();
// ['taylor' => 'name', 'laravel' => 'framework']
方法將透過指定的鍵來移除集合中對應的內容:$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$collection->forget('name');$collection->all();
// ['framework' => 'laravel']
forgetforPage()不會傳回修改後的新集合;它會直接修改原集合。
方法傳回一個含有指定頁碼數集合項目的新集合。這個方法接受頁碼數作為其第一個參數,每頁顯示的項數作為其第二個參數:$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);
$chunk = $collection->forPage(2, 3);$chunk->all();
// [4, 5, 6]
方法傳回指定鍵的集合項,如果該鍵在集合中不存在,則傳回null
:
你可以任選一個預設值作為第二個參數傳遞:$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$value = $collection->get('name');
// taylor
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']); $value = $collection->get('foo', 'default-value'); // default-value
你甚至可以將一個回呼函數作為預設值傳遞。如果指定的鍵不存在,就會傳回回呼函數的結果:
$collection->get('email', function () { return 'default-value'; }); // default-value#
groupBy()
groupBy
方法根據指定鍵將集合項目分組:
$collection = collect([ ['account_id' => 'account-x10', 'product' => 'Chair'], ['account_id' => 'account-x10', 'product' => 'Bookcase'], ['account_id' => 'account-x11', 'product' => 'Desk'], ]); $grouped = $collection->groupBy('account_id');$grouped->toArray(); /* [ 'account-x10' => [ ['account_id' => 'account-x10', 'product' => 'Chair'], ['account_id' => 'account-x10', 'product' => 'Bookcase'], ], 'account-x11' => [ ['account_id' => 'account-x11', 'product' => 'Desk'], ], ] */
你可以傳遞一個回呼函數用來代替一個字串的鍵
。這個回呼函數應該會傳回你希望用來分組的鍵的值:
$grouped = $collection->groupBy(function ($item, $key) { return substr($item['account_id'], -3); }); $grouped->toArray(); /* [ 'x10' => [ ['account_id' => 'account-x10', 'product' => 'Chair'], ['account_id' => 'account-x10', 'product' => 'Bookcase'], ], 'x11' => [ ['account_id' => 'account-x11', 'product' => 'Desk'], ], ] */
可以傳遞一個陣列用於多重分組標準。每一個陣列元素將對應多維數組內的對應等級:
$data = new Collection([ 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']], 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']], 30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']], 40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']], ]); $result = $data->groupBy([ 'skill', function ($item) { return $item['roles']; }, ], $preserveKeys = true); /* [ 1 => [ 'Role_1' => [ 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']], 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']], ], 'Role_2' => [ 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']], ], 'Role_3' => [ 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']], ], ], 2 => [ 'Role_1' => [ 30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']], ], 'Role_2' => [ 40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']], ], ], ]; */
has()
##has 方法判斷集合中是否存在指定鍵:
$collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]); $collection->has('product'); // true $collection->has(['product', 'amount']); // true $collection->has(['amount', 'price']); // false
#implode()
implode 方法用於合併集合項目。其參數取決於集合項的類型。如果集合包含數組或對象,你應該傳遞你希望合併的屬性的鍵,以及你希望放在值之間用來“拼接”的字符串:
$collection = collect([ ['account_id' => 1,'product' => 'Desk'], ['account_id' => 2, 'product' => 'Chair'], ]); $collection->implode('product', ', '); // Desk, Chair如果集合中包含簡單的字符串或數值,只需要傳入「拼接」用的字串作為此方法的唯一參數:
collect([1, 2, 3, 4, 5])->implode('-'); // '1-2-3-4-5'
intersect()
intersect 方法從原始集合中移除在指定
陣列 或集合中不存在的任何值。產生的集合將會保留原集合的鍵:
$collection = collect(['Desk', 'Sofa', 'Chair']); $intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']); $intersect->all(); // [0 => 'Desk', 2 => 'Chair']
intersectByKeys()
方法從原始集合中移除在指定陣列
或集合中不存在的任何鍵:
$collection = collect([ 'serial' => 'UX301', 'type' => 'screen', 'year' => 2009 ]); $intersect = $collection->intersectByKeys([ 'reference' => 'UX404', 'type' => 'tab', 'year' => 2011 ]); $intersect->all(); // ['type' => 'screen', 'year' => 2009]
,否則,傳回false
:
collect([])->isEmpty(); // true
#,否則,回傳false
:
collect([])->isNotEmpty(); // false
##keyBy()
keyBy
$collection = collect([ ['product_id' => 'prod-100', 'name' => 'Desk'], ['product_id' => 'prod-200', 'name' => 'Chair'], ]); $keyed = $collection->keyBy('product_id');$keyed->all(); /* [ 'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'], 'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'], ] */你也可以在這個方法傳遞一個回呼函數。此回呼函數傳回的值會作為該集合的鍵:
$keyed = $collection->keyBy(function ($item) { return strtoupper($item['product_id']); }); $keyed->all(); /* [ 'PROD-100' => ['product_id' => 'prod-100', 'name' => 'Desk'], 'PROD-200' => ['product_id' => 'prod-200', 'name' => 'Chair'], ] */###############keys()###### ######keys### 方法傳回集合中所有的鍵:###
$collection = collect([ 'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'], 'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'], ]); $keys = $collection->keys(); $keys->all(); // ['prod-100', 'prod-200']##################
last()
last
方法傳回集合中透過指定條件測試的最後一個元素:
collect([1, 2, 3, 4])->last(function ($value, $key) { return $value < 3; }); // 2
你也可以不傳入參數呼叫last
方法來取得集合中的最後一個元素。如果集合為空,則傳回null
:
collect([1, 2, 3, 4])->last(); // 4
macro()
靜態macro
方法允許你在執行時間將方法加入Collection
類別。關於更多信息,請參閱 擴展集合 的文檔。
make()
靜態make
方法可以創建一個新的集合實例。請參閱 建立集合 部分。
map()
map
方法遍歷集合並將每一個值傳入給定的回呼函數。這個回呼函數可以任意修改集合項目並傳回,從而產生被修改過集合項目的新集合:
$collection = collect([1, 2, 3, 4, 5]); $multiplied = $collection->map(function ($item, $key) { return $item * 2; }); $multiplied->all(); // [2, 4, 6, 8, 10]
{note} 與其它大多數集合方法一樣,
map
會傳回一個新的集合實例;它不會修改原集合。如果你想修改原集合,請使用transform
方法。
#mapInto()
mapInto()
方法可以迭代集合,透過將值傳遞給建構函式來建立給定類別的新實例:
class Currency{ /** * Create a new currency instance. * * @param string $code * @return void */ function __construct(string $code) { $this->code = $code; } } $collection = collect(['USD', 'EUR', 'GBP']); $currencies = $collection->mapInto(Currency::class); $currencies->all(); // [Currency('USD'), Currency('EUR'), Currency('GBP')]
## mapSpread()
mapSpread 方法可以遍歷集合項,將每個巢狀項值給指定的回呼函數。此回呼函數可以自由修改該集合項目並傳回,從而產生被修改過集合項目的新集合:
$collection = collect([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); $chunks = $collection->chunk(2); $sequence = $chunks->mapSpread(function ($even, $odd) { return $even + $odd; }); $sequence->all(); // [1, 5, 9, 13, 17]# #mapToGroups()
方法透過給定的回呼函數將集合項目分組。此回呼函數應該傳回一個包含單一鍵/ 值對的關聯數組,從而產生一個分組值的新集合:$collection = collect([
[
'name' => 'John Doe',
'department' => 'Sales',
],
[
'name' => 'Jane Doe',
'department' => 'Sales',
],
[
'name' => 'Johnny Doe',
'department' => 'Marketing',
]
]);
$grouped = $collection->mapToGroups(function ($item, $key) {
return [$item['department'] => $item['name']];
});
$grouped->toArray();
/*
[
'Sales' => ['John Doe', 'Jane Doe'],
'Marketing' => ['Johnny Doe'],
]
*/
$grouped->get('Sales')->all();
// ['John Doe', 'Jane Doe']
方法遍歷集合並將每個值傳入給定的回呼函數。此回呼函數將傳回一個包含單一鍵/ 值對的關聯數組:$collection = collect([
[
'name' => 'John',
'department' => 'Sales',
'email' => 'john@example.com'
],
[
'name' => 'Jane',
'department' => 'Marketing',
'email' => 'jane@example.com'
]
]);
$keyed = $collection->mapWithKeys(function ($item) {
return [$item['email'] => $item['name']];
});
$keyed->all();
/*
[
'john@example.com' => 'John',
'jane@example.com' => 'Jane',
]
*/
方法傳回指定鍵的最大值:$max = collect([['foo' => 10], ['foo' => 20]])->max('foo');
// 20
$max = collect([1, 2, 3, 4, 5])->max();
// 5
median()
median
方法傳回指定鍵的中值:
$median = collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->median('foo'); // 15 $median = collect([1, 1, 2, 4])->median(); // 1.5
merge()
#merge
方法將合併指定的陣列或集合到原始集合。如果給定的集合項目的字串鍵與原始集合中的字串鍵相匹配,則指定集合項目的值將覆蓋原始集合的值:
$collection = collect(['product_id' => 1, 'price' => 100]); $merged = $collection->merge(['price' => 200, 'discount' => false]); $merged->all(); // ['product_id' => 1, 'price' => 200, 'discount' => false]
如果指定的集合項目的鍵是數字,這些值將會追加到集合的末端:
$collection = collect(['Desk', 'Chair']); $merged = $collection->merge(['Bookcase', 'Door']); $merged->all(); // ['Desk', 'Chair', 'Bookcase', 'Door']
min()
##min 方法傳回指定鍵的最小值:
$min = collect([['foo' => 10], ['foo' => 20]])->min('foo'); // 10 $min = collect([1, 2, 3, 4, 5])->min(); // 1
mode()
mode 方法傳回指定鍵的
眾數 :
$mode = collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->mode('foo'); // [10] $mode = collect([1, 1, 2, 4])->mode(); // [1]
nth()
nth 方法建立由每隔n 個元素組成的一個新集合:
$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']); $collection->nth(4); // ['a', 'e']你可以選擇傳入一個偏移位置作為第二個參數:
$collection->nth(4, 1); // ['b', 'f']
#only()
#only 方法傳回集合中所有指定鍵的集合項目:
$collection = collect(['product_id' => 1, 'name' => 'Desk', 'price' => 100, 'discount' => false]); $filtered = $collection->only(['product_id', 'name']); $filtered->all(); // ['product_id' => 1, 'name' => 'Desk']與
only 對應的是
except 方法。
pad()
pad 方法將會使用給定的值填充數組,直到數組達到指定的大小。此方法的行為與
array_pad PHP 函數功能類似。
$collection = collect(['A', 'B', 'C']); $filtered = $collection->pad(5, 0); $filtered->all(); // ['A', 'B', 'C', 0, 0] $filtered = $collection->pad(-5, 0); $filtered->all(); // [0, 0, 'A', 'B', 'C']
partition( )
partition 方法可以和PHP 函數中的
list 結合使用,用來分開透過指定條件的元素以及那些不透過指定條件的元素:
$collection = collect([1, 2, 3, 4, 5, 6]); list($underThree, $equalOrAboveThree) = $collection->partition(function ($i) { return $i < 3; }); $underThree->all(); // [1, 2] $equalOrAboveThree->all(); // [3, 4, 5, 6]
#pipe()
pipe 方法將集合傳給指定的回呼函數並傳回結果:
$collection = collect([1, 2, 3]); $piped = $collection->pipe(function ($collection) { return $collection->sum(); }); // 6
pluck()
$collection = collect([ ['product_id' => 'prod-100', 'name' => 'Desk'], ['product_id' => 'prod-200', 'name' => 'Chair'], ]); $plucked = $collection->pluck('name'); $plucked->all(); // ['Desk', 'Chair']###你也可以透過傳入第二個參數來指定產生集合的鍵:###
$plucked = $collection->pluck('name', 'product_id'); $plucked->all(); // ['prod-100' => 'Desk', 'prod-200' => 'Chair']## #如果存在重複的鍵,則最後一個匹配元素將被插入到彈出的集合中:###
$collection = collect([ ['brand' => 'Tesla', 'color' => 'red'], ['brand' => 'Pagani', 'color' => 'white'], ['brand' => 'Tesla', 'color' => 'black'], ['brand' => 'Pagani', 'color' => 'orange'], ]); $plucked = $collection->pluck('color', 'brand'); $plucked->all(); // ['Tesla' => 'black', 'Pagani' => 'orange']##################
pop()
pop
方法從集合中移除並傳回最後一個集合項目:
$collection = collect([1, 2, 3, 4, 5]); $collection->pop(); // 5 $collection->all(); // [1, 2, 3, 4]
prepend()
#prepend
方法將指定的值新增的集合的開頭:
$collection = collect([1, 2, 3, 4, 5]); $collection->prepend(0); $collection->all(); // [0, 1, 2, 3, 4, 5]
你也可以傳遞第二個參數來設定新增加集合項目的鍵:
$collection = collect(['one' => 1, 'two' => 2]); $collection->prepend(0, 'zero'); $collection->all(); // ['zero' => 0, 'one' => 1, 'two' => 2]
#pull( )
pull
方法移除指定鍵對應的值並傳回:
$collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']); $collection->pull('name'); // 'Desk' $collection->all(); // ['product_id' => 'prod-100']
方法將指定的值追加到集合項目的最後:$collection = collect([1, 2, 3, 4]);
$collection->push(5);
$collection->all();
// [1, 2, 3, 4, 5]
方法從集合中傳回一個隨機項:
你可以選擇傳入一個整數到$collection = collect([1, 2, 3, 4, 5]);
$collection->random();
// 4 - (retrieved randomly)
來指定要取得的隨即項的數量。只要你顯示傳遞你希望接收的數量時,則會傳回項目的集合:
如果集合的項目小於指定的數量,則該方法將拋出 $random = $collection->random(3);
$random->all();
// [2, 4, 5] - (retrieved randomly)
方法將每次迭代的結果傳遞給下一次迭代直到集合減少為單一值:
第一次迭代時$collection = collect([1, 2, 3]);
$total = $collection->reduce(function ($carry, $item) {
return $carry + $item;
});
// 6
$carry
的數值為null
;however,你也可以透過傳入第二個參數到
來指定它的初始值:$collection->reduce(function ($carry, $item) {
return $carry + $item;}, 4);
// 10
# #reject()
reject
方法使用指定的回呼函數過濾集合。如果回呼函數回傳
true
$collection = collect([1, 2, 3, 4]); $filtered = $collection->reject(function ($value, $key) { return $value > 2; }); $filtered->all(); // [1, 2]
與
reject 方法對應的是 ##filter
方法。 reverse()
reverse
方法用來倒轉集合項目的順序,並保留原始的鍵:
$collection = collect(['a', 'b', 'c', 'd', 'e']); $reversed = $collection->reverse(); $reversed->all(); /* [ 4 => 'e', 3 => 'd', 2 => 'c', 1 => 'b', 0 => 'a', ] */#
search()
search
方法在集合中搜尋給定的值並傳回它的鍵。如果沒有找到,則傳回 false
。
$collection = collect([2, 4, 6, 8]); $collection->search(4); // 1
使用 “寬鬆”的方式進行搜索,這意味著具有整數值的字串會被認為等於相同值的整數。使用「嚴格」的方式進行搜索,就傳入true
作為該方法的第二個參數:
$collection->search('4', true); // false
或者,你可以透過傳遞回調函數來搜尋通過條件測試的第一個集合項目:
$collection->search(function ($item, $key) { return $item > 5; }); // 2
#shift()
##shift 方法移除並傳回集合的第一個集合項目:
$collection = collect([1, 2, 3, 4, 5]); $collection->shift(); // 1 $collection->all(); // [2, 3, 4, 5]
shuffle()
shuffle 方法隨機打亂集合項目:
$collection = collect([1, 2, 3, 4, 5]); $shuffled = $collection->shuffle(); $shuffled->all(); // [3, 2, 5, 1, 4] - (generated randomly)
slice()
slice 方法傳回集合中給定索引開始後面的部分:
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); $slice = $collection->slice(4); $slice->all(); // [5, 6, 7, 8, 9, 10]如果你想限制傳回內容的大小,可以將你期望的大小作為第二個參數傳遞到該方法:
$slice = $collection->slice(4, 2); $slice->all(); // [5, 6]預設情況下,傳回的內容將會保留原始鍵。如果你不希望保留原始鍵,你可以使用
some()
##contains 方法的別名。
方法對集合進行排序。排序後的集合會保留原始數組的鍵,所以在這個例子我們將使用values
方法去把鍵重設為連續編號的索引:
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sort();
$sorted->values()->all();
// [1, 2, 3, 4, 5]
如果你有更進階的排序需求,可以透過自己的演算法將回呼函數傳遞到
。請參閱 PHP 文件的 uasort
,這是集合的
sort 方法在底層所呼叫的。
#
sortBy()
sortBy
方法將根據指定鍵對集合進行排序。排序後的集合會保留原始數組的鍵,所以在這個例子中我們使用values
方法將鍵重設為連續編號的索引:
$collection = collect([ ['name' => 'Desk', 'price' => 200], ['name' => 'Chair', 'price' => 100], ['name' => 'Bookcase', 'price' => 150], ]); $sorted = $collection->sortBy('price');$sorted->values()->all(); /* [ ['name' => 'Chair', 'price' => 100], ['name' => 'Bookcase', 'price' => 150], ['name' => 'Desk', 'price' => 200], ] */
你也可以傳遞你自己的回呼函數用來決定如何對集合的值進行排序:
$collection = collect([ ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']], ['name' => 'Chair', 'colors' => ['Black']], ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']], ]); $sorted = $collection->sortBy(function ($product, $key) { return count($product['colors']); }); $sorted->values()->all(); /* [ ['name' => 'Chair', 'colors' => ['Black']], ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']], ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']], ] */
sortByDesc()
該方法與sortBy
方法一樣,但是會以相反的順序來對集合進行排序。
sortKeys()
sortKeys
方法透過底層關聯陣列的鍵來對集合進行排序:
$collection = collect([ 'id' => 22345, 'first' => 'John', 'last' => 'Doe', ]); $sorted = $collection->sortKeys();$sorted->all(); /* [ 'first' => 'John', 'id' => 22345, 'last' => 'Doe', ] */
#sortKeysDesc()
#該方法與sortKeys
方法一樣,但會以相反的順序來對集合進行排序。
splice()
splice
方法移除並傳回指定索引開始的集合項目片段:
$collection = collect([1, 2, 3, 4, 5]); $chunk = $collection->splice(2); $chunk->all(); // [3, 4, 5] $collection->all(); // [1, 2]
你可以傳遞第二個參數用來限制被刪除內容的大小:
$collection = collect([1, 2, 3, 4, 5]); $chunk = $collection->splice(2, 1); $chunk->all(); // [3] $collection->all(); // [1, 2, 4, 5]
此外,你可以傳入含有新參數項目的第三個參數來取代集合中刪除的集合項目:
$collection = collect([1, 2, 3, 4, 5]); $chunk = $collection->splice(2, 1, [10, 11]); $chunk->all(); // [3] $collection->all(); // [1, 2, 10, 11, 4, 5]
split()
split
方法將集合依照給定的值拆分:
$collection = collect([1, 2, 3, 4, 5]); $groups = $collection->split(3); $groups->toArray(); // [[1, 2], [3, 4], [5]]
##sum ()
sum 方法傳回集合內所有項目的和:
collect([1, 2, 3, 4, 5])->sum(); // 15如果集合包含巢狀數組或對象,則應該傳入一個鍵來指定要進行求和的值:
$collection = collect([ ['name' => 'JavaScript: The Good Parts', 'pages' => 176], ['name' => 'JavaScript: The Definitive Guide', 'pages' => 1096], ]); $collection->sum('pages'); // 1272另外,你可以傳入自己的回呼函數來決定要用集合中的哪些值進行求和:
$collection = collect([ ['name' => 'Chair', 'colors' => ['Black']], ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']], ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']], ]); $collection->sum(function ($product) { return count($product['colors']); }); // 6
#take()
#take 方法傳回給定數量項的新集合:
$collection = collect([0, 1, 2, 3, 4, 5]); $chunk = $collection->take(3); $chunk->all(); // [0, 1, 2]你也可以傳遞負整數從集合末端取得指定數量的項目:
$collection = collect([0, 1, 2, 3, 4, 5]); $chunk = $collection->take(-2); $chunk->all(); // [4, 5]
tap()
tap 方法將給定的回呼函數傳入該集合,允許你在一個特定點「tap」集合,並在不影響集合本身的情況下對集合項目執行某些操作:
collect([2, 4, 3, 1, 5]) ->sort() ->tap(function ($collection) { Log::debug('Values after sorting', $collection->values()->toArray()); }) ->shift(); // 1
times()
靜態times
方法透過呼叫給定次數的回呼函數來建立新集合:
$collection = Collection::times(10, function ($number) { return $number * 9; }); $collection->all(); // [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]
使用這個方法可以與工廠結合使用創建出Eloquent 模型:
$categories = Collection::times(3, function ($number) { return factory(Category::class)->create(['name' => "Category No. $number"]); }); $categories->all(); /* [ ['id' => 1, 'name' => 'Category #1'], ['id' => 2, 'name' => 'Category #2'], ['id' => 3, 'name' => 'Category #3'], ] */
toArray()
#toArray
方法將集合轉換成PHP 陣列
。如果集合的值是 Eloquent 模型,那也會轉換成陣列:
$collection = collect(['name' => 'Desk', 'price' => 200]); $collection->toArray(); /* [ ['name' => 'Desk', 'price' => 200], ] */
{note}
toArray
也會將所有集合的巢狀物件轉換為陣列。如果你想要取得原始數組,可以使用all
方法。
toJson()
toJson
方法將集合轉換成JSON 字串:
$collection = collect(['name' => 'Desk', 'price' => 200]); $collection->toJson(); // '{"name":"Desk", "price":200}'
#transform()
transform
方法迭代集合並對每一個集合項目呼叫給定的回呼函數。而集合的內容也會被回呼函數的傳回值所取代:
$collection = collect([1, 2, 3, 4, 5]); $collection->transform(function ($item, $key) { return $item * 2; }); $collection->all(); // [2, 4, 6, 8, 10]
{note} 與大多數集合方法不同,
transform
會修改集合本身。如果你想建立新集合,可以使用map
方法。
#union()
union
方法將給定的數組新增到集合。如果給定的陣列含有與原始集合一樣的鍵,則原始集合的值不會被改變:
$collection = collect([1 => ['a'], 2 => ['b']]); $union = $collection->union([3 => ['c'], 1 => ['b']]); $union->all(); // [1 => ['a'], 2 => ['b'], 3 => ['c']]
unique()
unique
方法傳回集合中所有唯一項目。傳回的集合保留原始數組的鍵,所以在這個例子中,我們使用values
方法把鍵重設為連續編號的索引:
$collection = collect([1, 1, 2, 2, 3, 4, 2]); $unique = $collection->unique(); $unique->values()->all(); // [1, 2, 3, 4]
在處理巢狀數組或物件時,你可以指定用於確定唯一性的鍵:
$collection = collect([ ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'], ['name' => 'iPhone 5', 'brand' => 'Apple', 'type' => 'phone'], ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'], ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'], ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'], ]); $unique = $collection->unique('brand'); $unique->values()->all(); /* [ ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'], ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'], ] */
你也可以透過傳遞自己的回呼函數來確定項目的唯一性:
$unique = $collection->unique(function ($item) { return $item['brand'].$item['type']; }); $unique->values()->all(); /* [ ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'], ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'], ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'], ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'], ] */
unique
方法在檢查項目值時使用「寬鬆」模式比較,表示具有整數值的字串將被視為等於相同值的整數。你可以使用 uniqueStrict
方法來做「嚴格」模式比較。
uniqueStrict()
這個方法與unique
方法一樣,然而,所有的值是用「嚴格」模式來比較的。
unless()
unless
方法當傳入的第一個參數不為true
的時候,將執行給定的回呼函數:
$collection = collect([1, 2, 3]); $collection->unless(true, function ($collection) { return $collection->push(4); }); $collection->unless(false, function ($collection) { return $collection->push(5); }); $collection->all(); // [1, 2, 3, 5]
與unless
對應的是when
方法。
unlessEmpty()
whenNotEmpty
# 方法的別名。
unlessNotEmpty()
whenEmpty
方法的別名。
unwrap()
靜態unwrap
方法傳回集合內部的可用值:
Collection::unwrap(collect('John Doe')); // ['John Doe']Collection::unwrap(['John Doe']); // ['John Doe']Collection::unwrap('John Doe'); // 'John Doe'
#values()
##values 方法傳回鍵被重設為連續編號的新集合:
$collection = collect([ 10 => ['product' => 'Desk', 'price' => 200], 11 => ['product' => 'Desk', 'price' => 200] ]); $values = $collection->values();$values->all(); /* [ 0 => ['product' => 'Desk', 'price' => 200], 1 => ['product' => 'Desk', 'price' => 200], ] */
when()
when 方法當傳入的第一個參數為
true 時,將執行給定的回呼函數:
$collection = collect([1, 2, 3]); $collection->when(true, function ($collection) { return $collection->push(4); }); $collection->when(false, function ($collection) { return $collection->push(5); }); $collection->all(); // [1, 2, 3, 4]與
when 對應的是
unless 方法。
whenEmpty()
whenEmpty 方法當集合為空時,將執行給定的回呼函數:
$collection = collect(['michael', 'tom']); $collection->whenEmpty(function ($collection) { return $collection->push('adam'); }); $collection->all(); // ['michael', 'tom'] $collection = collect();$collection->whenEmpty(function ($collection) { return $collection->push('adam'); }); $collection->all(); // ['adam'] $collection = collect(['michael', 'tom']); $collection->whenEmpty(function($collection) { return $collection->push('adam');}, function($collection) { return $collection->push('taylor'); }); $collection->all(); // ['michael', 'tom', 'taylor']與
whenEmpty 對應的是
whenNotEmpty 方法。
whenNotEmpty()
whenNotEmpty 方法當集合不為空時,將執行給定的回呼函數:
$collection = collect(['michael', 'tom']); $collection->whenNotEmpty(function ($collection) { return $collection->push('adam'); }); $collection->all(); // ['michael', 'tom', 'adam'] $collection = collect(); $collection->whenNotEmpty(function ($collection) { return $collection->push('adam'); }); $collection->all(); // [] $collection = collect(); $collection->whenNotEmpty(function($collection) { return $collection->push('adam'); }, function($collection) { return $collection->push('taylor'); }); $collection->all(); // ['taylor']與
whenNotEmpty 對應的是
whenEmpty 方法。
where()
where 方法透過給定的鍵/ 值對過濾集合:
$collection = collect([ ['product' => 'Desk', 'price' => 200], ['product' => 'Chair', 'price' => 100], ['product' => 'Bookcase', 'price' => 150], ['product' => 'Door', 'price' => 100], ]); $filtered = $collection->where('price', 100);$filtered->all(); /* [ ['product' => 'Chair', 'price' => 100], ['product' => 'Door', 'price' => 100], ] */
where 方法在檢查集合項值時使用「寬鬆」模式比較,這表示具有整數值的字串會被認為等於相同值的整數。你可以使用
whereStrict 方法進行「嚴格」模式比較。
whereStrict()
這個方法與whereBetween()
whereBetween
方法會用給定的範圍來篩選集合:
$collection = collect([ ['product' => 'Desk', 'price' => 200], ['product' => 'Chair', 'price' => 80], ['product' => 'Bookcase', 'price' => 150], ['product' => 'Pencil', 'price' => 30], ['product' => 'Door', 'price' => 100], ]); $filtered = $collection->whereBetween('price', [100, 200]); $filtered->all(); /* [ ['product' => 'Desk', 'price' => 200], ['product' => 'Bookcase', 'price' => 150], ['product' => 'Door', 'price' => 100], ] */
#whereIn()
#whereIn
會根據包含給定陣列的鍵/ 值對來篩選集合:
$collection = collect([ ['product' => 'Desk', 'price' => 200], ['product' => 'Chair', 'price' => 100], ['product' => 'Bookcase', 'price' => 150], ['product' => 'Door', 'price' => 100], ]); $filtered = $collection->whereIn('price', [150, 200]); $filtered->all(); /* [ ['product' => 'Bookcase', 'price' => 150], ['product' => 'Desk', 'price' => 200], ] */
whereIn
方法使用「寬鬆」的比較來檢查集合項目的值,這表示具有整數值的字串會被視為等於相同值的整數。你可以使用 whereInStrict
方法進行「嚴格」模式比較。
whereInStrict()
這個方法與whereIn
方法類似;不同的是會使用「嚴格」模式進行比較。
whereInstanceOf()
whereInstanceOf
方法根據指定的類別來過濾集合:
$collection = collect([ new User, new User, new Post, ]); return $collection->whereInstanceOf(User::class);
whereNotBetween()
whereNotBetween
方法在指定的範圍內篩選集合:
$collection = collect([ ['product' => 'Desk', 'price' => 200], ['product' => 'Chair', 'price' => 80], ['product' => 'Bookcase', 'price' => 150], ['product' => 'Pencil', 'price' => 30], ['product' => 'Door', 'price' => 100], ]); $filtered = $collection->whereNotBetween('price', [100, 200]); $filtered->all(); /* [ ['product' => 'Chair', 'price' => 80], ['product' => 'Pencil', 'price' => 30], ] */
whereNotIn()
方法使用「寬鬆」模式比較來檢查集合項的值,這意味著具有整數值的字串將被視為等於相同值的整數。你可以使用 whereNotInStrict
方法類似;不同的是會使用「嚴格」模式來比較。
$collection = Collection::wrap('John Doe'); $collection->all(); // ['John Doe'] $collection = Collection::wrap(['John Doe']); $collection->all(); // ['John Doe'] $collection = Collection::wrap(collect('John Doe')); $collection->all(); // ['John Doe']########################zip()####### #####zip### 方法將指定陣列的值和對應索引的原始集合的值合併在一起:###
$collection = collect(['Chair', 'Desk']); $zipped = $collection->zip([100, 200]); $zipped->all(); // [['Chair', 100], ['Desk', 200]]##################
高階訊息傳遞
集合也提供對「高階訊息傳遞」的支持,即集合常見操作的捷徑。支援高階訊息傳遞的集合方法有: average
, #avg
, contains
, each
, every
, filter
##, first, flatMap
, #groupBy
, keyBy
, map
, max
, min
, #partition
, reject
, some
#, sortBy
, sortByDesc
, sum
, and unique
。
each 高階訊息傳遞在集合中的每個物件上呼叫一個方法:
$users = User::where('votes', '>', 500)->get(); $users->each->markAsVip();同樣,我們可以使用
sum 高階訊息傳遞來收集users 集合中的「投票」總數:
$users = User::where('group', 'Development')->get(); return $users->sum->votes;本文章首發在