You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:37:29