为什么我不能在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));
}
}
答案 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
关键字才能创建变量的隔离范围。没有它您将无法向该函数注入任何其他变量。