雄辩的收藏:每个与前方

2022-08-30 09:21:15

可能不是Eloquent系列特有的问题,但它在与他们合作时击中了我。让我们假设我们有一个对象,它是 的一个实例。$collectionIlluminate\Support\Collection

现在,如果我们想迭代它,那么使用闭包与常规的优缺点是什么。有吗?each()foreach

foreach ($collection as $item) {
    // Some code
}

$collection->each(function ($item) {
    // Some code
});

答案 1

语句应该用作一种循环浏览集合并对其执行某种逻辑的方法。如果其中的内容会影响程序中的其他内容,请使用此循环。foreach

该方法用于循环遍历集合中的每个对象,并对每个对象执行闭包。然后,它返回结果数组。这是关键! 如果要以某种方式更改集合,则应使用。也许这是一系列汽车,你想使模型大写或小写。您只需将一个闭包传递给获取该对象并调用每个 Car 对象的模型的方法。然后,它将返回包含已进行更改的集合。.eacharray_map.each.eachstrtoupper()

故事的士气是这样的:使用方法以某种方式更改数组中的每个项目;使用循环来使用每个对象来影响程序的其他部分(使用一些逻辑语句)。.eachforeach

更新(2015 年 6 月 7 日)

正如下面雄辩地指出的那样(看看我在那里做了什么?),上面的答案有点不对劲。使用的方法从未实际使用过调用的输出。因此,创建的新数组不会保存在 .要更改它,最好使用该方法,该方法也存在于对象上。.eacharray_maparray_maparray_mapCollection.mapCollection

使用语句来循环访问每个语句更有意义,因为除非您确保使用语句,否则您将无法访问闭包之外的变量,这在我看来很尴尬。foreachuse

最初编写上述答案时的实现可以在这里找到

.each在拉拉维尔 5.1

他们在下面谈论的新内容不再使用 。它只是循环访问集合中的每个项,并调用传入的项,将项及其在数组中的键传递给它。从功能上讲,它似乎工作相同。我相信在阅读代码时使用循环会更有意义。但是,我看到了使用的好处,因为它允许您将方法链接在一起,如果这引起了您的兴趣。它还允许您从回调返回 false,以便在业务逻辑要求您能够这样做时提前离开循环。.eacharray_map$callbackforeach.each

有关新实现的详细信息,请查看源代码


答案 2

现有答案中有很多令人困惑的错误信息。

简短的回答

简短的回答是:使用 .each()foreach 迭代 Laravel 集合之间没有重大区别。这两种技术都能达到相同的效果。

如何修改项目?

是否修改项目与是否使用 vs. 无关。它们都允许您根据我们正在谈论的项目类型修改集合中的项目。它们都允许您修改集合中的项目。.each()foreach

  • 在集合包含对象时修改项目:如果集合是一组 PHP 对象(如 Eloquent 集合),或者允许您修改对象的属性(如 )。这仅仅是因为PHP对象总是像引用一样工作。如果尝试将整个对象替换为其他对象(不太常见的方案),请改用。.each()foreach$item->name = 'foo'.map()
  • 如果集合包含非对象,则修改项目:这种情况不太常见,但如果集合包含非对象(如字符串),则无法为您提供修改集合项值的方法。(关闭的返回值将被忽略。请改用。.each().map()

所以。。。我应该使用哪一个?

如果您想知道性能,我对雄辩项和字符串集合的大量集合进行了几次测试。在这两种情况下,使用速度都快于 。但我们谈论的是微秒。在大多数现实生活中,与访问数据库等所需的时间相比,速度差异并不显着。foreach.each()

这主要取决于您的个人喜好。使用很好,因为您可以将多个操作链接在一起(例如)。我倾向于在我自己的代码中使用两者,只是取决于每种情况看起来最干净的是什么。.each().where(...).each(...)


推荐