无法调用array_filter()之外的变量

时间:2016-01-21 11:39:06

标签: php arrays array-filter

为什么我不能在array_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));
    }
}

这是我的照片来描述我的问题。 无法在$val内调用参数$key[$val] enter image description here

2 个答案:

答案 0 :(得分:3)

匿名函数中的变量范围仅在匿名函数中。

您需要从父作用域继承该变量。 您可以在PHP文档中找到有关anonymous functions(示例#3)

的更多详细信息

会改变这一行:

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

进入这个:

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

答案 1 :(得分:1)

use中添加另一个变量:

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

编辑:

可在此处找到一个很好的解释:https://teamtreehouse.com/community/variable-functions-vs-php-closures

  

...... lambda的好处是它只存在   它所分配的变量有一个参考。所以PHP管理的方式   记忆是通过引用计数。从本质上讲,PHP引擎会读取所有内容   执行程序所需的文件,同时这样做   它找到所有使用的变量,并记录多少次   它们被使用(引用计数)。正在执行脚本   每次使用变量时,它都会从引用中减去一个变量   计数。一旦引用计数达到零,则删除该变量   (或多或少)。通常,函数会加载到内存中并保留   那里是整个脚本的执行。但是,lambda可以   一旦其变量的引用计数命中,就从内存中删除   零。

     

另一方面,闭包是一个封装的匿名函数   创建时全局范围的一部分。换一种说法,   你可以使用"使用"将变量传递给闭包。关键字和那   变量的值将与闭包时的值相同   无论发生什么事情都在关闭之外......

基本上需要use关键字才能创建变量的隔离范围。没有它您将无法向该函数注入任何其他变量。