今天想起了前几天写的一个php读取文件夹内文件列表的并返回文件路径的方法,因为前段时间用的时候只需读取两级目录,就随便写了一个,今天又彻底完善了一下,可直接递归读取文件夹内的文件夹,最终返回一维数组。当时在写这段程序的时候出现了乱码的现象。但当时已经对传进的参数进行了转码,并且可正常打印,但存到数组中之后却显示空白,经过仔细调试终于解决。
算法实现说明:
该算法核心是读取文件夹内的文件,若发现存在文件夹,就递归读取,将返回值在下面和第一级文件列表拼合,但这样最终的返回值是一个N维数组,N由文件夹的目录级数决定,所以,对返回值又进行了处理,将N维数组遍历返回一维数组。需要注意的是文件夹路径的转码问题,因为计算机读取文件夹的时候不认识中文汉字的utf8编码,所以每次中文路径都必须转为gb2312,此时计算机才认识。
主代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/* *php读取文件夹内文件及文件夹 *参数:文件夹路径$dir,格式要求:文件夹名称后必须有“/” *返回值:含有文件名称和路径的一维数组 *作者:kTWO *时间:2016-12-10 15:46:25 *网址:https://www.k2zone.cn/ */ function read($dir){ $dir_tem=$dir; //用于最终的路径拼接,解决乱码和不显示的bug $dir=iconv('utf-8', 'gb2312', $dir); //对参数路径进行gb2312转码 $data=scandir("$dir"); //返回指定目录中的文件和目录的数组。 $file_arr=array(); //暂存文件列表 $dir_arr=array(); //暂存文件夹内的文件列表 foreach($data as $file) { if(is_dir($dir.$file) && $file!='.' && $file!='..'){ //判断是否是文件夹内的文件夹 $file = iconv('gb2312' , 'utf-8' , $file); //对中文的文件夹进行转码 $dir_arr[]=read($dir.$file."/"); //递归读取文件夹内的文件 }else{ $file=iconv('gb2312' , 'utf-8' , $file ); //讲文件名转换为utf8编码,防止乱码 $dir=iconv('gb2312' , 'utf-8' , $dir ); if($file!='.' && $file!='..') { //过滤 $file_arr[]=$dir_tem.$file;} //进行路径拼接 } } $allFile = array_merge($file_arr,$dir_arr); //拼合数组 return $allFile; } function rebuild_array($arr){ //将多维数组变为一维数组 static $tmp=array(); //此处为静态变量,防止递归的时候数据丢失 for($i=0; $i<count($arr); $i++){ if(is_array($arr[$i])) rebuild_array($arr[$i]); //递归 else $tmp[]=$arr[$i]; } return $tmp; } function getFile($arr){ $data=read($arr); return rebuild_array($data); } |
运行结果:
使用时直接调用getFile()函数,传入路径参数即可。