我正在尝试遍历目录,只显示文件,没有文件夹。我在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()
功能的真正目的被误解了。
答案 0 :(得分:0)
它们不一样:
$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
函数
答案 1 :(得分:0)
如果你碰巧知道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
将成为该目录中的条目。