最近在写图片空间管理系统,需要遍历文件夹目录,百度了一下,发现了下面的第一个方法。但是想把文件夹目录结构保存到数组。就有了下面第二个自己写的方法。
PHP遍历文件夹目录或文件目录,直接输出结果。
原文:
PHP遍历文件夹及子文件夹所有文件
https://www.cnblogs.com/zemliu/archive/2012/05/04/2482614.html
代码:
- <html>
- <body>
- <?php
- function traverse($path = '.') {
- $current_dir = opendir($path); //opendir()返回一个目录句柄,失败返回false
- while(($file = readdir($current_dir)) !== false) { //readdir()返回打开目录句柄中的一个条目
- $sub_dir = $path . DIRECTORY_SEPARATOR . $file; //构建子目录路径
- if($file == '.' || $file == '..') {
- continue;
- } else if(is_dir($sub_dir)) { //如果是目录,进行递归
- echo 'Directory ' . $file . ':<br>';
- traverse($sub_dir);
- } else { //如果是文件,直接输出
- echo 'File in Directory ' . $path . ': ' . $file . '<br>';
- }
- }
- }
- traverse('xxtt');
- ?>
- </body>
- </html>
复制代码
遍历文件夹目录或文件目录,并将目录结构写入数组。
由于上面的函数会循环嵌套自身,所以不便于数组的记录。需要重新写一个单层的遍历函数,然后循环调用。
function traverse_sigle_folder($path = '.') {
$current_dir = opendir($path); //opendir()返回一个目录句柄,失败返回false
$i = 0;
$folder = array(); //用数组记录目录结构
while(($file = readdir($current_dir)) !== false) { //readdir()返回打开目录句柄中的一个条目
$sub_dir = $path . DIRECTORY_SEPARATOR . $file; //构建子目录路径
if($file == '.' || $file == '..') {
continue;
}else if(is_dir($sub_dir)) {
$folder[$i]['file_name'] = $file; //文件名
$folder[$i]['file_type'] = 'directory'; //文件夹类型
$i++;
//这里去掉了循环嵌套
}else{ //如果是文件,直接输出
$folder[$i]['file_name'] = $file;
$type = ltrim(strchr($file,'.'),'.'); //截取文件名后缀名 判断是否为图片
switch($type){
case 'jpg':
case 'JPG':
case 'gif':
case 'GIF':
case 'jpeg':
case 'JPEG':
case 'bmp':
case 'BMP':
case 'png':
case 'PNG':
$folder[$i]['file_type'] = 'image'; //图片类型
break;
default:
$folder[$i]['file_type'] = 'file'; //其他类型文件
break;
}
$i++;
}
}
return $folder;
}
使用单层遍历函数,将文件目录结构写入数组:
$path = './Uploads/';
$array = traverse_sigle_folder($path); //首次调用单层遍历函数 获取第一层级目录结构
foreach($array as $k => $v){
if($v['file_type'] == 'directory'){
$array[$k]['files'] = traverse_sigle_folder($path.'/'.$array[$k]['file_name']); //这里假设目录只有3层,如果有多层可以再变化一下
}
}
这样就获得了目录数组:$array.
echo '';
var_dump($array);
结果是类似这样的:
|