当前位置: 首页 > news >正文

Laravel Collection 基本使用

创建集合

为了创建一个集合,可以将一个数组传入集合的构造器中,也可以创建一个空的集合,然后把元素写到集合中。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) {// 如果要中断对内容的迭代,那就从回调中返回 falseif (/* 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]]

相关文章:

Laravel Collection 基本使用

创建集合 为了创建一个集合&#xff0c;可以将一个数组传入集合的构造器中&#xff0c;也可以创建一个空的集合&#xff0c;然后把元素写到集合中。Laravel 有collect()助手&#xff0c;这是最简单的&#xff0c;新建集合的方法。 $collection collect([1, 2, 3]);默认情况下…...

JUC并发编程19 | 读写锁

有一些关于锁的面试题&#xff1a; 你知道 Java 里面有哪些锁&#xff1f;读写锁的饥饿问题是什么&#xff1f;有没有比读写锁更快的锁&#xff1f;StampedLock知道嘛&#xff1f;&#xff08;邮戳锁/票据锁&#xff09;ReentrantReadWriteLock 有锁降级机制&#xff1f; Ree…...

springboot_maven项目怎么引入mybatis

在pom.xml文件中添加mybatis和mybatis-spring-boot-starter的依赖 org.mybatis mybatis ${mybatis.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.spring.version} 配置mybatis 在application.properties&#xff08;或application.yml&#xff0…...

JAVA8的新特性——lambda表达式

JAVA8的新特性——lambda表达式 此处&#xff0c;我们首先对于Java8的一些特性作为一个简单介绍 Java 8是Java编程语言的一个重要版本&#xff0c;于2014年发布。Java 8引入了许多新特性和改进&#xff0c;以提高开发效率和性能。以下是Java 8的一些主要新特性&#xff1a; Lam…...

算法修炼之练气篇——练气六层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…...

利用GPU并行计算beta-NTI,大幅减少群落构建计算时间

1 先说效果 18个样本&#xff0c;抽平到8500条序列&#xff0c;4344个OTUs&#xff0c;计算beta-NTI共花费时间如下。如果更好的显卡&#xff0c;更大的数据量&#xff0c;节约的时间应该更加可观。 GPU&#xff08;GTX1050&#xff09;&#xff1a;1分20秒 iCAMP包 的bNTIn.p(…...

Shiro框架漏洞分析与复现

Shiro简介 Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性&#xff0c;可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。 1、Shiro反序列…...

(数字图像处理MATLAB+Python)第七章图像锐化-第一、二节:图像锐化概述和微分算子

文章目录 一&#xff1a;图像边缘分析二&#xff1a;一阶微分算子&#xff08;1&#xff09;梯度算子A&#xff1a;定义B&#xff1a;边缘检测C&#xff1a;示例D&#xff1a;程序 &#xff08;2&#xff09;Robert算子A&#xff1a;定义B&#xff1a;示例C&#xff1a;程序 &a…...

C# | 内存池

内存池 文章目录 内存池前言什么是内存池内存池的优点内存池的缺点 实现思路示例代码结束语 前言 在上一篇文章中&#xff0c;我们介绍了对象池的概念和实现方式。对象池通过重复利用对象&#xff0c;避免了频繁地创建和销毁对象&#xff0c;提高了系统的性能和稳定性。 今天我…...

程序设计入门——C语言2023年5月10日

程序设计入门——C语言 1、window下安装gcc 课程来源&#xff1a;链接: 浙江大学 翁恺 程序设计入门——C语言 学习日期&#xff1a;2023年5月10日 1、window下安装gcc 如果想让gcc在windows下运行&#xff0c;需要将gcc&#xff0c;及对于的lib包&#xff0c;都安装到window…...

【2023华为OD笔试必会25题--C语言版】《03 单入口空闲区域》——递归、数组、DFS

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

Grafana安装、升级与备份(02)

一、安装Grafana软件包 Grafana部署非常简单,直接使用yum命令从官网拉到安装再启动就可以了,本次使用的grafana版本为9.5.0 官网下载地址:Download Grafana | Grafana Labs # wget yum install -y https://dl.grafana.com/oss/release/grafana-9.5.0-1.x86_64.rpm # yum …...

【2023华为OD笔试必会25题--C语言版】《10 相同数字的积木游戏》——数组

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

awk命令编辑

awk工作原理 逐行读取文本&#xff0c;默认以空格或tab键分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&#xff0c;并按模式或者条件执行编辑命令。 sed命令常用于一整行的处理&#xff0c;而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息…...

Pinia和Vuex的区别

Pinia和Vuex都是Vue.js状态管理库 Pinia是一个轻量级的状态管理库&#xff0c;它专注于提供一个简单的API来管理应用程序的状态。 相比之下&#xff0c;Vuex是一个更完整的状态管理库&#xff0c;它提供了更多的功能&#xff0c;比如模块化、插件和严格模式等。 Pinia是基于V…...

《C++高并发服务器笔记——第四章Linux网络编程》

计算机网络等相关知识可以去小林coding进行巩固&#xff08;点击前往&#xff09; 《C高并发服务器笔记——第四章》 4.1、网络结构模式1.C/S结构①C/S结构简介②C/S结构优点③C/S结构缺点 2.B/S结构①B/S结构简介②B/S结构优点③B/S结构缺点 4.2和4.3、MAC地址、IP地址、端口…...

NFS服务器搭建(案例)

目录标题 第一个问题1.安装软件包2.进入配置文件进行定义&#xff0c;并创建对应的资源文件3.客户端进行挂载&#xff0c;并查看挂载信息&#xff0c;修改挂载权限4.客户端查看挂载的信息 第二个问题1.服务端配置文件进行定义&#xff0c;并创建对应资源文件2.客户端进行挂载3.…...

ubuntu 22.04 安装 Docker Desktop 及docker介绍

目录 一、Docker Desktop 安装 1、我们先去官网下载安装包 2、Install Docker Desktop on Ubuntu 3、Launch Docker Desktop 二、Docker 介绍 什么是docker 如何使用docker docker是如何工作的 docker build docker run docker pull 一、Docker Desktop 安装 1、我们先…...

微前端中的应用隔离是什么,一般是怎么实现的?

微前端中的应用隔离是什么&#xff0c;一般是怎么实现的? 前言一、iframe 隔离二、Web Components三、JavaScript 沙箱隔离四、Shadow DOM 隔离总结 前言 微前端中的应用隔离是指将不同的微前端应用程序隔离开来&#xff0c;以确保它们之间不会相互影响或干扰。这种隔离可以通…...

【python pandas】合并文件并剔除重复数据

1.背景 工作中需要处理多个文件&#xff0c;每个文件里面有重复的数据&#xff0c;剔除重复数据&#xff0c;保留最新的数据 2.代码&#xff1a; import pandas as pd import osdl [] #person_list是文件路径 for i in range(person_list_len):#把文件df全部集合进列表dldl.a…...

Spellman高压电源X射线发生器维修XRB160PN480X4593

spellman高压发生器维修VMX40P5X4629&#xff1b;Spellman X射线发生器维修X4593系列 X射线源维修。 Spellman所拥有的变频器架构可以使高压电源获得高利用率的效率和功率密度。固体密封的高压模块进一步减少了尺寸和重量。 基于表面贴装控制电路的数字信号处理器提供通讯接口…...

msvcr120.dll丢失怎样修复?msvcr120.dll丢失修复的四个方法

打开软件跟游戏提示msvcr120.dll丢失&#xff0c;无法执行此代码怎么办&#xff1f;刚刚遇到这个问题&#xff0c;我都无从下手。家人们&#xff0c;你是不是也被这个问题也困扰过。msvcr120.dll是什么文件呢&#xff1f;经过我一个下午的时间研究&#xff0c;终于搞清楚了&…...

马哈鱼SQLFLow数据流生成介绍

马哈鱼数据血缘分析器是当前最流行的数据血缘关系(data lineage)管理工具之一&#xff0c;它是一种通过分析SQL脚本来自动发现数据流向的工具。它通过生成一个简洁的图表来显示数据仓库中表/视图和列之间的数据流。支持超过20种流行的数据库&#xff0c;包括 bigquery, couchba…...

使用 MVC 模式,实现简单登录功能 (Kotlin)

先放效果图&#xff1a; 第一张是登录页面效果图。用户输入登录名和密码&#xff0c;经过后台的非空验证和固定值验证&#xff0c;跳转到首页 第二张是首页效果图。用户点击 “update” 显示用户名和密码 这里的用户名和密码是后台设置的固定值&#xff0c;整体的登录逻辑特别…...

ASEMI代理LT8471IFE#PBF原装ADI车规级LT8471IFE#PBF

编辑&#xff1a;ll ASEMI代理LT8471IFE#PBF原装ADI车规级LT8471IFE#PBF 型号&#xff1a;LT8471IFE#PBF 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;TSSOP-20 批号&#xff1a;2023 引脚数量&#xff1a;20 工作温度&#xff1a;-40C~125C 安装类型&#xff1a;表面…...

8. 100ASK_V853-PRO开发板支持MPP媒体处理平台

0.前言 ​ MPP 系统控制模块&#xff0c;根据芯片特性&#xff0c;完成硬件各个部件的复位、基本初始化工作&#xff0c;同时负责完成 MPP&#xff08;Media Process Platform 媒体处理平台&#xff09;系统各个业务模块的初始化、去初始化以及管理 MPP 系统各个业务模块的工作…...

CLMP证书:让你在职场中脱颖而出的秘密武器!

CLMP证书是一种精益管理专业证书&#xff0c;是针对精益管理领域的专业人士和学生的培训项目&#xff0c;旨在提高他们在精益管理方面的技能和知识。那么&#xff0c;CLMP证书的含金量高吗&#xff1f;接下来我们来探讨一下。 CLMP证书的优势体现 首先&#xff0c;CLMP证书的…...

【从零开始】Docker Desktop:听说你小子要玩我

前言 &#x1f34a;缘由 捡起遗忘的Docker知识 由于本狗近期项目紧任务重&#xff0c;高强度的搬砖导致摸鱼时间下降。在上线项目时&#xff0c;看到运维大神一系列骚操作&#xff0c;dockerk8s的知识如过眼云烟&#xff0c;忘得干净的很。所以想重新恶补一下docker知识&…...

制造业为什么要数字化?

制造业数字化&#xff0c;主要包含以下一些因素&#xff0c;有优势也有缺点&#xff1a; 制造业数字化的优势&#xff1a; 提高效率&#xff1a;数字化允许各种制造过程自动化&#xff0c;可以提高效率并降低成本。可以缩短生产时间、减少浪费并提高生产率。 增强质量控制&am…...

NPC 也有了生命?当 ChatGPT 注入游戏你能想象吗

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 引言&#xff1a;西部世界元宇宙&#xff0c;还记得吗ChatGPT 的世界&#xff1f; 下图就是一个 ChatGPT 小镇&#xff1a; 引言&#xff1a;西部世界 《西部世界》以一个虚构的游戏般的“西部世界”为背景…...