Laravel Collection 基本使用

PHPer技術棧發表於2023-05-12

建立集合

為了建立一個集合,可以將一個陣列傳入集合的構造器中,也可以建立一個空的集合,然後把元素寫到集合中。Laravel 有collect()助手,這是最簡單的,新建集合的方法。

$collection = collect([1, 2, 3]);

預設情況下, Eloquent 查詢的結果返回的內容都是 Illuminate\Support\Collection 例項,如果希望對結果進行序列化,可以使用toArray()toJson() 方法。

在非Laravel 專案中使用集合:

安裝:

composer require illuminate/support

使用:

<?php
// 引入package
require __DIR__ . '/vendor/autoload.php';

$collection = collect([1, 2, 3]);
var_dump($collection);

記住,所有方法都可以使用鏈式程式設計的方式優雅的操縱陣列。而且幾乎所有的方法都會返回新的 Collection 例項,

all

返回該集合表示的底層陣列。

collect(["boo", "yumi", "mac"])->all();
// [“boo”, "yumi", "mac"]

avg

獲取陣列的平均值:

collect([1, 1, 2, 4])->avg(); // 2

獲取二維陣列的平均值:

collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->avg('foo'); // 20

avg()average() 的別名,兩者的效果是一樣的。

chunk

將大集合按指定大小拆分成小集合。

$collection = collect([1, 2, 3, 4, 5, 6, 7]);
$chunks = $collection->chunk(4);
$chunks->toArray();
// [[1, 2, 3, 4], [5, 6, 7]]

chunkWhile

根據指定的回撥值把集合分解成多個更小的集合:

$collection = collect(str_split('AABBCCCD'));

$chunks = $collection->chunkWhile(function ($current, $key, $chunk) {
    return $current === $chunk->last();
});

$chunks->all();
// [['A', 'A'], ['B', 'B'], ['C', 'C', 'C'], ['D']]

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

將一個集合的值作為「鍵」,再將另一個陣列或者集合的值作為「值」合併成一個集合。

$collection = collect(['name', 'age']);
$combined = $collection->combine(['boo', 25]);
$combined->all();
// ['name' => 'boo', 'age' => 25]

collect

返回一個包含當前集合所含元素的新的 Collection 例項:

$collection = collect([1, 2, 3]);
$collection->all(); 
// [1,2,3]

concat

在集合的末端附加指定的陣列或集合值:

$collection = collect(['John Doe']);
$concatenated = $collection->concat(['Boo'])->concat(['name' => 'Yumi']);
$concatenated->all();
// ['John Doe', 'Boo', 'Yumi']

contains

判斷集合是否包含給定的專案。

基本用法:

$collection = collect(['name' => 'boo', 'age' => 25]);
$collection->contains('boo');  // true
$collection->contains('yumi'); // false

也可以用 contains 方法匹配一對鍵/值,即判斷給定的配對是否存在於集合中:

$collection = collect([
    ['name' => 'boo', 'age' => 25],
    ['name' => 'yumi', 'age' => 23],
]);

$collection->contains("name", "mac");  // false

也可以傳遞一個回撥到 contains 方法來執行自己的真實測試:

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

// $value: 1 $key: 0
$collection->contains(function ($value, $key) {
    return $value > 5;
}); // false

contains 方法在檢查專案值時使用「寬鬆」比較,意味著具有整數值的字串將被視為等於相同值的整數。 相反 containsStrict 方法則是使用「嚴格」比較進行過濾。

containsStrict

使用「嚴格模式」判斷集合是否包含給定的專案:

基本使用:

$collection = collect([
    ['name' => 'boo', 'age' => 25],
    ['name' => 'yumi', 'age' => 23],
]);

$collection->containsStrict("age", "25");  // false

如上例所示,陣列值存在,但是值型別不一致也返回false。

count

返回該集合內的專案總數。

collect([1, 2, 3, 4])->count();  // 4

countBy

統計集合中每個元素出現的次數。

基本用法:

$collection = collect([1, 2, 2, 2, 3, 5, 5]);
$counted = $collection->countBy();
$counted->all();
// [1 => 1, 2 => 3, 3 => 1, 5=>2]

進階用法,自定義規則,統計元素出現的次數:

$collection = collect(['alice@gmail.com', 'bob@yahoo.com', 'carlos@gmail.com']);
$counted = $collection->countBy(function ($email) {
    return substr(strrchr($email, "@"), 1);
});
$counted->all();
// ['gmail.com' => 2, 'yahoo.com' => 1]

## crossJoin

返回指定集合的可能的笛卡爾積。

$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

備份檔案系統和停止系統(dump and die)的縮寫,列印集合元素並中斷指令碼執行。

$collection = collect(['John Doe', 'Jane Doe']);
$collection->dd();

如果不想中斷執行指令碼,請使用dump方法替代。

diff

與給定的集合或者陣列進行比較,基於值求差集。

將集合與其它集合或純 PHP 陣列進行值的比較,然後返回原集合中存在而給定集合中不存在的值:

$collection = collect([1, 2, 3, 4, 5]);
$collection->diff([2, 4, 6, 8])->all();   // [1, 3, 5]

diffAssoc

與給定的集合或者陣列進行比較,基於鍵值對求差集。

返回原集合不存在於給定集合中的鍵值對:

$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

與給定的集合或者陣列進行比較,基於鍵求差集。

返回原集合中存在而給定的集合中不存在「鍵」所對應的鍵值對:

$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]

duplicates

從集合中檢索並返回重複的值。

基本用法:

$collection = collect(['a', 'b', 'a', 'c', 'b']);
$collection->duplicates();
// [2 => 'a', 4 => 'b']

如果集合包含陣列或物件,則可以傳遞希望檢查重複值的屬性的鍵:

$employees = collect([
    ['email' => 'abigail@example.com', 'position' => 'Developer'],
    ['email' => 'james@example.com', 'position' => 'Designer'],
    ['email' => 'victoria@example.com', 'position' => 'Developer'],
])

$employees->duplicates('position');
// [2 => 'Developer']

duplicates 方法在檢查專案值時使用「寬鬆」比較,相反duplicatesStrict 方法則是使用「嚴格」比較進行過濾。

each

迭代集合中的內容並將其傳遞到回撥函式中。

$collection = $collection->each(function ($item, $key) {
    // 如果要中斷對內容的迭代,那就從回撥中返回 false
    if (/* some condition */) {
        return false;
    }
});

eachSpread

同樣是遍歷集合,不過與each 的區別在於,對於多維陣列,可以直接拿到元素。

$collection = collect([['Boo', 25, "men"], ['Yumi', 23, "woman"]]);

$collection->eachSpread(function ($name, $age, $gender) {
    var_dump($name, $age, $gender);
    // Boo、25、men
    // Yumi、23、woman
});

$collection->each(function ($item, $key){
   // 同樣可以在回撥函式中,返回false ,終止迴圈
   var_dump($item, $key);
});
/*
    array(3) {
      [0]=>
      string(3) "Boo"
      [1]=>
      int(25)
      [2]=>
      string(3) "men"
    }
*/

every

檢查集合中的每一個元素是否透過指定條件:

collect([1, 2, 3, 4])->every(function ($value, $key) {
    return $value > 2;
});

// false

注意:如果集合為空, every 將返回 true。

except

返回集合中除了指定鍵以外的所有專案。

$collection = collect(['product_id' => 1, 'price' => 100, 'discount' => false]);
$filtered = $collection->except(['price', 'discount']);
$filtered->all(); // ['product_id' => 1]

與之相反的方法是 only()

filter

使用給定的回撥函式過濾集合的內容,只留下那些透過的元素。

$collection = collect([1, 2, 3, 4]);
$filtered = $collection->filter(function ($value, $key) {
    // 當閉包返回true 時,保留一個條目
    return $value > 2;
});
$filtered->all(); // [3, 4]

如果沒有提供回撥函式,集合中所有返回false的元素都會被移除:

$collection = collect([1, 2, 3, null, false, '', 0, []]);
$collection->filter()->all(); // [1, 2, 3]

與之相反的方法是 reject()

first

返回集合中的第一個元素。

基本用法:

collect([1, 2, 3, 4])->first();  // 1

同樣可以傳入回撥函式,進行條件限制:

collect([1, 2, 3, 4])->first(function ($value, $key) {
    // 當閉包返回true 時,保留一個條目
    return $value > 2;
}); // 3

如果需要返回最後一個元素可以使用last() 方法。

firstWhere

返回集合中含有指定鍵 / 值對的第一個元素:

$collection = collect([
    ['name' => 'Regena', 'age' => null],
    ['name' => 'Linda', 'age' => 14],
    ['name' => 'Diego', 'age' => 23],
    ['name' => 'Linda', 'age' => 84],
]);

// 返回name = Linda 的第一個元素
$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]

firstMap

遍歷集合並將其中的每個值傳遞到給定的回撥。

可以透過回撥修改每個值的內容再返回出來,從而形成一個新的被修改過內容的集合:

$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

將多維集合轉為一維。

基本用法:

$collection = collect(['name' => 'taylor', 'languages' => ['php', 'javascript']]);

$collection->flatten()->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'],傳入深度引數能限制設定返回陣列的層數。

flip

鍵值反轉。

$collection = collect(["name" => "boo", "age" => 25]);
$collection->flip()->all();  // ["boo" => "name", 25 => "age"]

forget

透過給定的鍵來移除掉集合中對應的內容。

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$collection->forget('name');
$collection->all(); 
// ['framework' => 'laravel']

與大多數集合的方法不同,forget() 不會返回修改過後的新集合;它會直接修改原來的集合。

get

返回給定鍵的專案。

基本用法,如果該鍵不存在,則返回 null:

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$value = $collection->get('name'); // taylor

可以傳遞第二個引數作為預設值:

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$value = $collection->get('foo', 'boo'); // boo

甚至可以將回撥函式當作預設值。如果指定的鍵不存在,就會返回回撥的結果:

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);

$collection->get('email', function () {
    return 'boo';
}); // boo

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->all();

/*
    [
        '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->all();

/*
    [
        '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

判斷集合中是否存在給定的鍵。

$collection = collect(["name" => "boo", "age" => 25]);
$collection->has("name");  // true

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

從原集合中移除不在給定陣列或集合中的『任何值』,返回新的集合將保留原集合的鍵。

$collection = collect(['Desk', 'Sofa', 'Chair']);
$intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']);
$intersect->all();
// [0 => 'Desk', 2 => 'Chair']

intersectKey

刪除原集合中不存在於給定陣列或集合中的『任何鍵』,返回新的集合將保留原集合的鍵。

$collection = collect([
    'serial' => 'UX301', 'type' => 'screen', 'year' => 2009,
]);

$intersect = $collection->intersectByKeys([
    'reference' => 'UX404', 'type' => 'tab', 'year' => 2011,
]);
$intersect->all();
// ['type' => 'screen', 'year' => 2009]

isEmpty

判斷集合是否為空。

collect([])->isEmpty(); // true

isNotEmpty

判斷集合是否不為空。

collect([])->isEmpty(); // false

join

將集合中的值用字串連線。

collect(['a', 'b', 'c'])->join(', '); // 'a, b, c'
collect(['a', 'b', 'c'])->join(', ', ', and '); // 'a, b, and c'
collect(['a', 'b'])->join(', ', ' and '); // 'a and b'
collect(['a'])->join(', ', ' and '); // 'a'
collect([])->join(', ', ' and '); // ''

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

返回集合的所有鍵。

$collection = collect(["name" => "boo", "age" => 25]);
$collection->keys()->all();  // ["name", "age"]

last

返回集合中透過給定真實測試的最後一個元素,與first 方法正好相反。

collect([1, 2, 3, 4])->last(function ($value, $key) {
    return $value < 3;
});
// 2

map

遍歷集合並將每一個值傳入給定的回撥,返回新的集合。

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

$multiplied = $collection->map(function ($item, $key) {
    return $item * 2;
});

$multiplied->all();
// [2, 4, 6, 8, 10]

與其他大多數集合方法一樣, map 會返回一個新的集合例項;它不會修改原集合。如果你想修改原集合,請使用 transform 方法。

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->all();

/*
    [
        'Sales' => ['John Doe', 'Jane Doe'],
        'Marketing' => ['Johnny Doe'],
    ]
*/

$grouped->get('Sales')->all();
// ['John Doe', 'Jane Doe']

mapWithKeys

遍歷集合並將每個值傳入給定的回撥。

max

返回指定鍵的最大值。

$max = collect([['foo' => 10], ['foo' => 20]])->max('foo');   // 20
$max = collect([1, 2, 3, 4, 5])->max();   // 5

median

返回指定鍵的中間值。

$median = collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->median('foo');   // 15
$median = collect([1, 1, 2, 4])->median();  // 1.5

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 = collect([1, 2, 3, 4, 5])->min();     // 1

mode

返回指定鍵的眾數值。

collect([1, 1, 2, 4])->mode();    // [1]

nth

每隔n個元素取一個元素組成一個新的集合。

$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);
$collection->nth(4);    // ['a', 'e']

// 第二個引數可以作為偏移位置

$collection->nth(4, 1); // ['b', 'f']

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']

partition

配合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

將集合傳給給定的回撥並返回結果。

$collection = collect([1, 2, 3]);
$piped = $collection->pipe(function ($collection) {
    return $collection->sum();
}); // 6

pluck

獲取集合中給定鍵對應的所有值。

基本用法:

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk', "id" => 1],
    ['product_id' => 'prod-200', 'name' => 'Chair', "id" => 2],
]);

$plucked = $collection->pluck('name');
$plucked->all();    // ['Desk', 'Chair']

還可以傳入第二個引數作為鍵值:

$plucked = $collection->pluck('name', "id");
$plucked->all();    // [1 => 'Desk', 2 => 'Chair']

pop

移除並返回集合中的最後一個專案。

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

$collection->pop();     // 5
$collection->all();     // [1, 2, 3, 4]

prepend

將給定的值新增到集合的開頭。

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

$collection->prepend(99);
$collection->all();     // [99, 1, 2, 3, 4, 5]

如果是關聯陣列,也可以傳入第二個引數作為鍵值:

$collection = collect(['one' => 1, 'two' => 2]);

$collection->prepend(0, 'zero');
$collection->all();       // ['zero' => 0, 'one' => 1, 'two' => 2]

pull

把給定鍵對應的值從集合中移除並返回。

$collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);

$collection->pull('name');    // 'Desk'
$collection->all();           // ['product_id' => 'prod-100']

push

把給定值新增到集合的末尾。

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

$collection->push(5);
$collection->all();       // [1, 2, 3, 4, 5]

put

在集合內設定給定的鍵值對。

$collection = collect(['product_id' => 1, 'name' => 'Desk']);

$collection->put('price', 100);
$collection->all();       // ['product_id' => 1, 'name' => 'Desk', 'price' => 100]

random

從集合中返回一個隨機項。

$collection = collect([1, 2, 3, 4, 5]);
$collection->random();      // 4 - (retrieved randomly)

也可以傳入一個整數用來指定需要需要獲取的隨機項個數:

$collection->random();    // 2, 3, 5

reject

使用指定的回撥過濾集合。

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

$filtered = $collection->reject(function ($value, $key) {
    return $value > 2;
});
$filtered->all();     // [1, 2]

reverse

倒轉集合中專案的順序,並保留原始的鍵值:

$collection = collect(['a', 'b', 'c', 'd', 'e']);

$reversed = $collection->reverse();
$reversed->all();
/*
    [
        4 => 'e',
        3 => 'd',
        2 => 'c',
        1 => 'b',
        0 => 'a',
    ]
*/

search

搜尋給定的值並返回它的鍵,如果沒有找到返回 false

$collection = collect([2, 4, 6, 8]);

$collection->search(4);   // 1

shift

移除並返回集合的第一個元素。

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

$collection->shift();   // 1
$collection->all();     // [2, 3, 4, 5]

shuffle

隨機排序集合中的專案。

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

$shuffled = $collection->shuffle();
$shuffled->all();       // [3, 2, 5, 1, 4] - (generated randomly)

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]

skip() 方法類似。

sort

保留原陣列的鍵,對集合進行排序。

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

$sorted = $collection->sort();

// 重置索引

$sorted->values()->all();       // [1, 2, 3, 4, 5]

splice

刪除並返回從給定值後的內容,原集合也會受到影響。

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

$chunk = $collection->splice(2);
$chunk->all();            // [3, 4, 5]
$collection->all();       // [1, 2]

split

將集合按給定的值拆分。

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

$groups = $collection->split(3);
$groups->all();     // [[1, 2], [3, 4], [5]]

sum

返回集合內所有專案的總和。

collect([1, 2, 3, 4, 5])->sum();    // 15

take

返回給定數量專案的新集合。

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

$chunk = $collection->take(3);
$chunk->all();      // [0, 1, 2]

times

靜態times() 方法透過呼叫給定次數的回撥函式來建立新集合:

$collection = Collection::times(10, function ($number) {
    return $number * 9;
});
$collection->all();     // [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]

transform

迭代集合並對集合內的每個專案呼叫給定的回撥。

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

$multiplied = $collection->map(function ($item, $key) {
    return $item * 2;
});
$multiplied->all();     // [2, 4, 6, 8, 10]

注意:each 只是遍歷集合,map 則會返回一個新的集合例項;它不會修改原集合。如果你想修改原集合,請使用 transform 方法。

union

將給定的陣列新增到集合中。如果給定的陣列含有與原集合一樣的鍵,則首選原始集合的值。

$collection = collect([1 => ['a'], 2 => ['b']]);

$union = $collection->union([3 => ['c'], 1 => ['b']]);
$union->all();      // [1 => ['a'], 2 => ['b'], 3 => ['c']]

unique

返回集合中所有唯一的專案。

基本用法:

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

$unique = $collection->unique();
// 使用value 重置索引
$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'],
    ]
*/

values

返回鍵被重置為連續編號的新集合。

$collection = collect([5, 3, 1, 2, 4]);
$sorted->values()->all();   // [1, 2, 3, 4, 5]

when

當傳入的第一個引數為 true 的時,將執行給定的回撥。

$collection = collect([1, 2, 3]);

$collection->when(true, function ($collection) {
    return $collection->push(4);
});
$collection->all();     // [1, 2, 3, 4]

// 當傳入的第一個引數不為 true 的時候,將執行給定的回撥函式

$collection->unless(false, function ($collection) {
    return $collection->push(5);
});

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],
    ]
*/

whereStrict方法使用嚴格模式透過給定的鍵值過濾集合。

whenEmpty

當集合為空時,將執行給定的回撥函式。

$collection = collect(['michael', 'tom']);

$collection->whenEmpty(function ($collection) {
    return $collection->push('adam');
});
$collection->all();     // ['michael', 'tom']

反之whenNotEmpty() 方法當集合不為空時,將執行給定的回撥函式。

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' => 'Desk', 'price' => 200],
        ['product' => 'Bookcase', 'price' => 150],
    ]
*/

類似方法還有whereNotInwhereBetweenwhereNotInStrict

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],
    ]
*/

zip

將給定陣列的值與相應索引處的原集合的值合併在一起。

$collection = collect(['Chair', 'Desk']);

$zipped = $collection->zip([100, 200]);
$zipped->all();     // [['Chair', 100], ['Desk', 200]]
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章