今天想起了前几天写的一个php读取文件夹内文件列表的并返回文件路径的方法,因为前段时间用的时候只需读取两级目录,就随便写了一个,今天又彻底完善了一下,可直接递归读取文件夹内的文件夹,最终返回一维数组。当时在写这段程序的时候出现了乱码的现象。但当时已经对传进的参数进行了转码,并且可正常打印,但存到数组中之后却显示空白,经过仔细调试终于解决。
算法实现说明:
该算法核心是读取文件夹内的文件,若发现存在文件夹,就递归读取,将返回值在下面和第一级文件列表拼合,但这样最终的返回值是一个N维数组,N由文件夹的目录级数决定,所以,对返回值又进行了处理,将N维数组遍历返回一维数组。需要注意的是文件夹路径的转码问题,因为计算机读取文件夹的时候不认识中文汉字的utf8编码,所以每次中文路径都必须转为gb2312,此时计算机才认识。
主代码:
/*
*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
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);
}
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/
*/
functionread($dir){
$dir_tem=$dir; //用于最终的路径拼接,解决乱码和不显示的bug
$dir=iconv('utf-8','gb2312',$dir); //对参数路径进行gb2312转码
$data=scandir("$dir"); //返回指定目录中的文件和目录的数组。
$file_arr=array(); //暂存文件列表
$dir_arr=array(); //暂存文件夹内的文件列表
foreach($dataas$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;
}
functionrebuild_array($arr){ //将多维数组变为一维数组
static$tmp=array(); //此处为静态变量,防止递归的时候数据丢失
for($i=0;$i
if(is_array($arr[$i]))rebuild_array($arr[$i]); //递归
else$tmp[]=$arr[$i];
}
return$tmp;
}
functiongetFile($arr){
$data=read($arr);
returnrebuild_array($data);
}
运行结果:
使用时直接调用getFile()函数,传入路径参数即可。