Php 无法在数组_filter()之外调用变量

Php 无法在数组_filter()之外调用变量,php,arrays,array-filter,Php,Arrays,Array Filter,为什么我不能在array\u filter()之外调用变量,这是我的代码 class JsonSelect { public function jsonSource($jsonSource, $val){ $file_contents = file_get_contents($jsonSource); if(!$file_contents){ throw new Exception('Invalid file name');

为什么我不能在
array\u filter()之外调用变量,这是我的代码

class JsonSelect
{
    public function jsonSource($jsonSource, $val){

        $file_contents = file_get_contents($jsonSource);

        if(!$file_contents){
            throw new Exception('Invalid file name');
        }

        $json = json_decode($file_contents, true);
        $q = $_POST['q'];
        $filtered = $json;

        if(strlen($q)) {
            $filtered = array_filter($json, function ($key) use ($q) {
                if (stripos($key[$val], $q) !== false) {
                    return true;
                } else {
                    return false;
                }
            });
        }

        echo json_encode(array_slice(array_values($filtered), 0, 20));
    }
}
这是我的照片来描述我的问题。 无法在
$key[$val]
内部调用参数
$val

使用中添加另一个变量:

$filtered = array_filter($json, function ($key) use ($q, $key) {
                if (stripos($key[$val], $q) !== false) {
                    return true;
                } else {
                    return false;
                }
            });
编辑:

以下是一个很好的解释:

…lambda的好处是它只在 分配给它的变量有一个引用。因此,PHP的管理方式 内存是通过引用计数的。基本上,PHP引擎读取所有 执行程序所需的文件,以及执行程序时 它查找所有使用的变量,并记录使用了多少次 使用它们(参考计数)。当脚本正在执行时 每次使用变量时,它都会从引用中减去一个 计数一旦引用计数为零,变量将被删除 (或多或少)。通常,一个函数被加载到内存中并保持不变 在脚本的整个执行过程中,都会出现错误。但是,可以使用lambda 一旦变量的引用计数命中,就从内存中删除 零

另一方面,闭包是一个匿名函数,用于封装 创建全局作用域时全局作用域的一部分。换句话说,, 您可以使用“use”关键字将变量传递给闭包,并且 变量的值将与关闭时的值相同 不管发生了什么都要创建的在关闭之外


基本上,
use
关键字是为变量创建隔离范围所必需的。如果没有它,您将无法向函数中注入任何附加变量。

匿名函数中变量的作用域仅在匿名函数中

您需要从父范围继承变量。 您可以在PHP文档中找到关于它的更多详细信息(示例3)

这将改变这条线:

$filtered = array_filter($json, function ($key) use ($q) {
为此:

$filtered = array_filter($json, function ($key) use ($q, $val) {

请补充他为什么要这样做来完成答案。因为这个答案目前是,它不值得一个答案,应该是一个评论。是的!完美地工作。。。。谢谢,德拉吉斯:)