使用PHP删除空的子文件夹 [英] Remove empty subfolders with PHP

查看:91
本文介绍了使用PHP删除空的子文件夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用一个PHP函数,它将以递归方式删除从给定绝对路径开始不包含文件的所有子文件夹.

I am working on a PHP function that will recursively remove all sub-folders that contain no files starting from a given absolute path.

这是到目前为止开发的代码:

Here is the code developed so far:

function RemoveEmptySubFolders($starting_from_path) {

    // Returns true if the folder contains no files
    function IsEmptyFolder($folder) {
        return (count(array_diff(glob($folder.DIRECTORY_SEPARATOR."*"), Array(".", ".."))) == 0);
    }

    // Cycles thorugh the subfolders of $from_path and
    // returns true if at least one empty folder has been removed
    function DoRemoveEmptyFolders($from_path) {
        if(IsEmptyFolder($from_path)) {
            rmdir($from_path);
            return true;
        }
        else {
            $Dirs = glob($from_path.DIRECTORY_SEPARATOR."*", GLOB_ONLYDIR);
            $ret = false;
            foreach($Dirs as $path) {
                $res = DoRemoveEmptyFolders($path);
                $ret = $ret ? $ret : $res;
            }
            return $ret;
        }
    }

    while (DoRemoveEmptyFolders($starting_from_path)) {}
}

根据我的测试,此功能有效,尽管我很高兴看到任何有关更好地执行代码的想法.

As per my tests this function works, though I would be very delighted to see any ideas for better performing code.

推荐答案

如果在空文件夹中的空文件夹中有空文件夹,则需要遍历所有文件夹三遍.所有这一切,因为您要广度扩展-在测试其子级之前先测试文件夹.相反,您应该在测试父文件夹是否为空之前进入子文件夹,这样一遍就足够了.

If you have empty folder within empty folder within empty folder, you'll need to loop through ALL folders three times. All this, because you go breadth first - test folder BEFORE testing its children. Instead, you should go into child folders before testing if parent is empty, this way one pass will be sufficient.

function RemoveEmptySubFolders($path)
{
  $empty=true;
  foreach (glob($path.DIRECTORY_SEPARATOR."*") as $file)
  {
     if (is_dir($file))
     {
        if (!RemoveEmptySubFolders($file)) $empty=false;
     }
     else
     {
        $empty=false;
     }
  }
  if ($empty) rmdir($path);
  return $empty;
}

顺便说一句,glob不会返回.和..条目.

By the way, glob does not return . and .. entries.

更短版本:

function RemoveEmptySubFolders($path)
{
  $empty=true;
  foreach (glob($path.DIRECTORY_SEPARATOR."*") as $file)
  {
     $empty &= is_dir($file) && RemoveEmptySubFolders($file);
  }
  return $empty && rmdir($path);
}

这篇关于使用PHP删除空的子文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆