帮助PHP array_filter函数

Yar*_*rin 6 php array-filter

请参阅以下函数来扫描目录中的文件(取自此处)

function scandir_only_files($dir) {
   return array_filter(scandir($dir), function ($item) {
       return is_file($dir.DIRECTORY_SEPARATOR.$item);
   });
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为$ dir不在匿名函数的范围内,并显示为空,导致过滤器每次都返回FALSE.我该怎么改写这个?

Arn*_*anc 15

您必须使用use关键字显式声明从父作用域继承的变量:

// use the `$dir` variable from the parent scope
function ($item) use ($dir) {
Run Code Online (Sandbox Code Playgroud)
function scandir_only_files($dir) {
   return array_filter(scandir($dir), function ($item) use ($dir) {
       return is_file($dir.DIRECTORY_SEPARATOR.$item);
   });
}
Run Code Online (Sandbox Code Playgroud)

这个例子来自匿名函数页.

闭包可以从父作用域继承变量.必须在函数头中声明任何此类变量.闭包的父作用域是声明闭包的函数(不一定是从中调用它的函数).