each
迭代集合中的内容,不改变原集合的同时将其传递到回调函数中。
php
collect([1, 2])->each(fn (int $value) => dump("The current value is ${value}"));
// "The current value is 1"
// "The current value is 2"
不要尝试在回调函数中直接调用
return
改变集合,因为each
方法不会改变原集合。如果需要执行改变原数组的话可以使用 map 方法。例如:
phpcollect([1, 2])->each(fn ($value) => "The current value is ${value}");
中断迭代
如果要中断对内容的迭代,那就从回调中返回 false
,如下示例:
php
collect([1, 2, 3, 4])->each(function ($value) {
if ($value > 2) {
return false;
}
dump("The current value is ${value}");
});
// "The current value is 1"
// "The current value is 2"
当触发条件返回
false
后的循环停止了。
获取二维数组
php
collect([
["banners", 45, "California"],
["apples", 20, "Florida"],
["coconuts", 60, "Texas"],
])->each(function ($value) {
dump("We have {$value[1]} {$value[0]} in our {$value[2]} store.");
});
// "We have 45 banners in our California store."
// "We have 20 apples in our Florida store."
// "We have 60 coconuts in our Texas store."
在循环的回调函数中通过下标获取对应值的方式不是很优雅,可能过一段时间就忘了对应的值是什么。
有没有更加优雅的方式优化这个问题呢?可以使用 eachSpread 方法。
php
collect([
["banners", 45, "California"],
["apples", 20, "Florida"],
["coconuts", 60, "Texas"],
])->eachSpread(function ($product, $qty, $location) {
dump("We have {$product} {$qty} in our {$location} store.");
});
// "We have banners 45 in our California store."
// "We have apples 20 in our Florida store."
// "We have coconuts 60 in our Texas store."
可以看到通过调用 eachSpread 方法,在回调函数中有更明确的变量可供使用,变得更加有寓意话。