实际目录内容
<?php
class Solution {
public function forMl($dir){
$arr = [];
$file_arr = scandir($dir);
foreach($file_arr as $item){
if($item!='..'&&$item!='.'){
$new_dir = $dir.'\\'.$item;
if(is_dir($new_dir)){
$arr[$item] =$this->forMl($new_dir);
}else{
$arr[] = $item;
}
}
}
clearstatcache();
return $arr;
}
}
$s = new Solution();
$dir = 'D:\demo';
$c = $s->forMl($dir);
var_dump($c);
?>
返回的值
函数分析:
scandir : 列出目录中的文件和目录, 其中必然返回的 . 和..表示当前目录和上级目录,是系统为了索引方便而显示。我们只获取当前目录下的文件 所以需要屏蔽掉这两种返回值
is_dir : 函数检查指定的文件是否是目录,是返回true (注意该函数为了提高性能会缓存)
clearstatcache:清除文件状态缓存,在此是为了清除 is_dir 留下的缓存
编码思路:
scandir只能获取当前目录下的文件和目录 ,对于demo下的二级目录,例如 one 下面的 one1 内的目录结构无法获知,所有我们需要把 D:\demo\one 代入函数内,查询one下面的目录结构。
所以我们只需要把文件地址代入scandir中 然后循环得到的函数,排除掉里面的 .和.. 当将获取到的目录和原地址拼接起来判断是否是目录。若不是目录则是文件,只需直接放入空数组内;则直接递归
调用自己将新的地址代入进去,一直到没有目录需要再操作为止。最后再使用 clearstatcache 清理掉is_dir留下来的缓存,避免它在删除文件后依旧存在判断通过的操作。