PHP列表目录结构并排除一些目录

cha*_*lie 5 php

我有这个PHP代码:

$rootpath = '../admin/';
$inner = new RecursiveDirectoryIterator($rootpath);
$fileinfos = new RecursiveIteratorIterator($inner);

foreach ($fileinfos as $pathname => $fileinfo)
{
    $pathname2 = substr($pathname,2);
    $sql = "SELECT * from admin_permissions where page_name = '$pathname2'";
    $rs = mysql_query($sql,$conn);
    if (mysql_num_rows($rs) == 0)
    {
        if (!$fileinfo->isFile()) continue;
        $sql2 = "INSERT into admin_permissions (page_name) values ('$pathname2')";
        $rs2 = mysql_query($sql2,$conn);
        echo "$pathname<br>";
    }
}
Run Code Online (Sandbox Code Playgroud)

这是显示我的目录结构并将目录和文件名插入数据库(删除前2个字符..).

由于RecursiveDirectoryIterator遍历所有目录中的所有文件,如何排除整个目录,包括其中的所有文件?

Lev*_*son 20

从本质上讲,我的回答与托马斯的答案没有多大区别.但是,他没有得到一些正确的答案:

  • 语义正确,RecursiveCallbackFilterIterator要求您返回true递归到子目录.
  • 他略过不...每个子目录内的目录
  • 他的in_array支票并不完全符合他的预期

所以,我写了这个答案.假设我理解你想要的东西,这将正常工作:

编辑:他已修复了这三个问题中的2个; 第三个可能不是一个问题,因为他写他的条件检查的方式,但我不太确定.

<?php

$directory = '../admin';

// Will exclude everything under these directories
$exclude = array('.git', 'otherDirToExclude');

/**
 * @param SplFileInfo $file
 * @param mixed $key
 * @param RecursiveCallbackFilterIterator $iterator
 * @return bool True if you need to recurse or if the item is acceptable
 */
$filter = function ($file, $key, $iterator) use ($exclude) {
    if ($iterator->hasChildren() && !in_array($file->getFilename(), $exclude)) {
        return true;
    }
    return $file->isFile();
};

$innerIterator = new RecursiveDirectoryIterator(
    $directory,
    RecursiveDirectoryIterator::SKIP_DOTS
);
$iterator = new RecursiveIteratorIterator(
    new RecursiveCallbackFilterIterator($innerIterator, $filter)
);

foreach ($iterator as $pathname => $fileInfo) {
    // do your insertion here
}
Run Code Online (Sandbox Code Playgroud)


ThW*_*ThW 11

我建议使用RecursiveCallbackFilterIterator.

$directory = '../admin/';
$filter = array('.git');

$fileinfos = new RecursiveIteratorIterator(
  new RecursiveCallbackFilterIterator(
    new RecursiveDirectoryIterator(
      $directory,
      RecursiveDirectoryIterator::SKIP_DOTS
    ),
    function ($fileInfo, $key, $iterator) use ($filter) {
      return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter);
    }
  )
);

foreach($fileinfos as $pathname => $fileinfo) {
  //...
}
Run Code Online (Sandbox Code Playgroud)