今天看到这样一到面试题:

然后我尝试了这个函数,发现一个问题,这个函数只能读取给定目录下的所有文件和目录,不能获取给定目录下所有的文件名(就是子目录下的文件名)。

通过查手册发现这个函数,在网上有些错误的理解,在这里纠正一下。

array scandir ( string $directory [, int $sorting_order [, resource $context ]] )

作用:列出指定路径中的文件和目录。

参数:①给定的目录;②排序顺序(默认按字母的升序排列)③比较复杂,参考手册为准。

返回值:成功返回一个array,失败返回FALSE。如果给定的不是目录,返回FALSE的同时,会给一条警告。

例子:

  

输出:


这里有趣的是在手册中,说明了这个函数在PHP4中的实现原理:

$dir = '/';

$open = opendir($dir);

while (false !== ($file = readdir($open))){
    $filename[] = $file;
}

echo "<pre>";
sort($filename);
print_r($filename);

rsort($filename);
print_r($filename);

 

这里的输出和上面的格式一样。也就是scandir的原理。

这里所用到的函数:

resource opendir ( string $path [, resource $context ] )

作用:打开目录句柄(用之前一般用is_dir判断目录是否存在)(一般后面跟closedir()readdir()rewinddir() 操作

参数:①目录;②详见手册。

返回值:成功返回打开后的资源。失败返回FALSE。如果参数不是目录则产生警告。

 

string readdir ([ resource $dir_handle ] )

作用:从目录句柄中读取条目

参数:①目录句柄的 resource,之前由 opendir() 打开

返回值:成功时返回文件名,失败时返回FALSE。

 

最后 sort和rsort函数我记得我在以前的随笔里提到过,是对数组的排序。需要注意的是这两个函数是引用传递,函数执行完后,数组的元素顺序会发生变化。