PHP中如何向array_filter的回调函数传递外部参数?
解决PHP array_filter回调函数无法访问外部参数的问题
这个问题我之前也碰到过,核心是PHP匿名函数(闭包)访问外部变量的方式不对,咱们一步步来解决:
原代码的问题分析
你现在的写法有两个关键问题:
- 当使用
ARRAY_FILTER_USE_KEY时,array_filter只会给回调函数传递数组的键这一个参数,所以你回调里写的$item其实是键,而第二个参数$number根本不会被array_filter传入,等于无效; - 外部函数
functionName的$number参数,默认不能被内部匿名函数直接访问,得用特定方式引入。
修正后的代码
解决方法很简单,用PHP闭包的use关键字把外部的$number引入到匿名函数里就行,修正后的代码如下:
function functionName($number){ // some code $items = array_filter(SomeClass::$items, function ($key) use ($number) { // 取键的最后一位数字,和传入的$number对比 return ($key % 10 == $number); }, ARRAY_FILTER_USE_KEY); // some code }
关键知识点解释
use ($number):这行代码让匿名函数能“捕获”外部作用域的$number变量,也就是你传给functionName的那个参数;- 回调参数改为
$key:因为ARRAY_FILTER_USE_KEY模式下,回调接收的是数组的键,这样语义更清晰,避免混淆; - 逻辑判断
$key % 10 == $number:通过取模10运算拿到键的最后一位数字,和目标数字对比,符合条件的键对应的元素会被保留在过滤后的数组中。
如果之后你需要在匿名函数里修改外部的$number变量,可以把use ($number)改成use (&$number)(添加引用符号),不过这里只是用来做对比判断,所以不需要引用。
内容的提问来源于stack exchange,提问作者Zbyszek Kisły
相关产品推荐
相关产品推荐

