【问题标题】:Cannot call variable outside array_filter() [duplicate]无法在array_filter()之外调用变量[重复]
【发布时间】:2016-04-27 15:24:53
【问题描述】:

为什么我不能在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]内部调用

【问题讨论】:

    标签: php arrays array-filter


    【解决方案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”关键字将变量传递给闭包 变量的值将与关闭时的值相同 无论在闭包之外发生什么都创建...

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

    【讨论】:

    • 请通过添加他必须这样做的原因来完成答案。由于这个答案目前是,它不值得回答,应该是评论。
    【解决方案2】:

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

    您需要从父作用域继承变量。 您可以在有关anonymous functions 的 PHP 文档中找到有关它的更多详细信息(示例 #3)

    这会改变这条线:

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

    进入这个:

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

    【讨论】:

    • 是的!完美运行....感谢 Dragis :)
    猜你喜欢
    • 2014-11-17
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2016-02-09
    相关资源
    最近更新 更多