2011-09-11 76 views
6

请参阅下面的函数以扫描目录(来自here两者)​​帮助PHP array_filter功能

function scandir_only_files($dir) { 
    return array_filter(scandir($dir), function ($item) { 
     return is_file($dir.DIRECTORY_SEPARATOR.$item); 
    }); 
} 

这并不工作,因为$ dir是不在范围内的匿名函数的文件,显示为空,导致过滤器每次都返回FALSE。我将如何重写这个?

回答

15

你必须明确地宣布从父作用域继承的变量,用use关键字:

// use the `$dir` variable from the parent scope 
function ($item) use ($dir) { 

function scandir_only_files($dir) { 
    return array_filter(scandir($dir), function ($item) use ($dir) { 
     return is_file($dir.DIRECTORY_SEPARATOR.$item); 
    }); 
} 

this example匿名函数页。

闭包可能继承父范围的变量。任何这样的变量都必须在函数头部声明。闭包的父范围是闭包被声明的函数(不一定是它被调用的函数)。

+0

+1使用'使用' – tttony

+0

@ arnaud-真棒 - 刚刚学到了新东西! – Yarin