如何在Laravel集合的filter闭包函数中正确传递外部变量
如何将外部变量传入Laravel集合filter方法的闭包中?
我编写了如下函数:
function permissions_filter($id, $filter) { return User::where('id', $id)->first()->getAllPermissions()->pluck('name')->filter(function ($item) { return str_contains($item, $filter) == true; })->values(); }
我需要将外部的$filter变量传入filter方法内部的闭包函数中,但直接将$filter添加到闭包参数列表(如function ($item, $filter))时,$filter会被识别为遍历集合项时的键值对(与foreach ($item as $k=>$v)的行为一致),请问该如何正确实现变量传递?
这是Laravel开发里很常见的闭包作用域问题,你只需要用use关键字就能把外部变量引入闭包的作用域,完美解决这个问题,具体修改如下:
function permissions_filter($id, $filter) { return User::where('id', $id)->first()->getAllPermissions()->pluck('name')->filter(function ($item) use ($filter) { return str_contains($item, $filter); })->values(); }
给你补充几个小细节:
use关键字的作用就是让闭包捕获外部作用域的变量,这样闭包里的$filter就会指向外部传入的参数,而不会被当成集合遍历的键- 另外
str_contains本身返回的就是布尔值,没必要再额外和== true做比较,直接返回结果代码会更简洁 - 如果你后续需要在闭包里修改外部变量的数值,可以在
use里加上引用符号&(比如use (&$filter)),不过这里你只需要读取变量,所以不需要这一步
内容的提问来源于stack exchange,提问作者Mathias Hillmann
相关产品推荐
相关产品推荐

