热搜词
发表于 2017-2-11 21:41:14 | 显示全部楼层 |阅读模式
最近在写图片空间管理系统,需要遍历文件夹目录,百度了一下,发现了下面的第一个方法。但是想把文件夹目录结构保存到数组。就有了下面第二个自己写的方法。

PHP遍历文件夹目录或文件目录,直接输出结果。


原文:
PHP遍历文件夹及子文件夹所有文件   
https://www.cnblogs.com/zemliu/archive/2012/05/04/2482614.html

代码:
  1. <html>
  2.     <body>
  3.         <?php
  4.             function traverse($path = '.') {
  5.                 $current_dir = opendir($path);    //opendir()返回一个目录句柄,失败返回false
  6.                 while(($file = readdir($current_dir)) !== false) {    //readdir()返回打开目录句柄中的一个条目
  7.                     $sub_dir = $path . DIRECTORY_SEPARATOR . $file;    //构建子目录路径
  8.                     if($file == '.' || $file == '..') {
  9.                         continue;
  10.                     } else if(is_dir($sub_dir)) {    //如果是目录,进行递归
  11.                         echo 'Directory ' . $file . ':<br>';
  12.                         traverse($sub_dir);
  13.                     } else {    //如果是文件,直接输出
  14.                         echo 'File in Directory ' . $path . ': ' . $file . '<br>';
  15.                     }
  16.                 }
  17.             }

  18.             traverse('xxtt');
  19.         ?>
  20.     </body>
  21. </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);
结果是类似这样的:









全部评论1
灰儿 发表于 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);       
        ?>

回复

使用道具 举报

回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|管理员之家 ( 苏ICP备2023053177号-2 )

GMT+8, 2024-11-25 03:03 , Processed in 0.212826 second(s), 27 queries .

Powered by Discuz! X3.5

Cpoyright © 2001-2024 Discuz! Team