灰儿 发表于 2017-2-11 21:41:14

PHP遍历文件夹目录;获取文件夹目录数组

最近在写图片空间管理系统,需要遍历文件夹目录,百度了一下,发现了下面的第一个方法。但是想把文件夹目录结构保存到数组。就有了下面第二个自己写的方法。

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);
结果是类似这样的:









灰儿 发表于 2017-2-11 22:42:26

<?php
    $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++;
      }
    }
        print_r($folder);       
        ?>

页: [1]
查看完整版本: PHP遍历文件夹目录;获取文件夹目录数组