我试图通过目录循环,只显示文件,没有文件夹。我在SO上从另一个人那里遇到了这段代码,虽然它可以工作,但我不明白是怎么回事。
function scandir_nofolders($d) {
return array_filter(scandir($d), function ($f) use($d) {
return ! is_dir($d . "/" . $f);
});
}
那么假设我用下面的代码运行它:
print_r(scandir_nofolders('/xampp');
当is_dir()函数确定所提供的参数是否为目录时,我挣扎的地方是最内部的返回值。
你认为代码应该翻译成
return ! is_dir('/xampp'./.'/xampp');
注意在上面的例子中$d和$f是相同的。如果你调用一个匿名函数并使用use函数在这种情况下使用$d, $d和$f不应该是完全相同的吗,因为$f实际上是复制了$d ?显然,我不是在寻找/xampp//xampp(这是我认为代码将转换成的),但它可以完美地工作。有人能解释一下这段代码到底是干什么的吗?我想,如果有的话,我误解了use()
函数的真正目的。
如果您碰巧了解Javascript,那么等效的代码将是:
function scandir_nofolders(d) {
return scandir(d).filter(function (f) {
return !is_dir(d + "/" + f);
});
}
这是怎么回事?最里面的is_dir
调用使用d
和f
的连接。d
是传递给函数的同一个d
, f
是scandir
返回的数组中一个元素的值。在Javascript中,函数的父作用域的变量和函数内部的变量一样可用。
在PHP中,情况并非如此。
$d = 'foo';
function () {
// no access to $d here
}
要使$d
在匿名函数中可用,您需要使用use
"传递它"。$d
将是父目录,$f
将是该目录中的一个条目。
参见参考资料:什么是变量作用域,哪些变量可以从哪里访问,什么是"未定义的变量";错误吗?
它们不一样:
$d
-是你传递给scandir_nofolders作为参数的目录(在你的例子中是'/xampp'
$f
-是该目录(文件、目录、目录)中的单个项。或者. .)
要进行检查,只需在函数中添加echo:
function scandir_nofolders($d) {
return array_filter(scandir($d), function ($f) use($d) {
echo $d.' '.$f."<br />";
return ! is_dir($d . "/" . $f);
});
}
,你会看到不同。
在闭包中,闭包参数是你想要进行操作的元素(例如排序,或者在你的情况下显示/检查项目),在use
中,你可以添加其他变量,因为在你的情况下,你需要传递那些项目(文件)放置的目录,使用is_dir
函数