1

再帰を実行している間、特定のディレクトリからすべてのファイルとフォルダを除外する必要があります。私はこれまでにこのコードを持っています:

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($websiteRoot.$file["filepathfromroot"]));
     foreach ($it as $currentfile)
     {
      if (!$it->isDot()&&$it->isFile()&&!in_array($it->getSubPath(), $file["exclude-directories"])) {

        //do something
         }
     }

ただし、このサブパスは子にのみ一致し、子から離れたファイルやサブディレクトリには一致しません。つまり、Foo / bar/hello.phpのディレクトリ構造の場合。Fooを除外リストに追加しても、hello.phpが結果に含まれます。

誰かがこれに対する解決策を持っていますか?

4

1 に答える 1

0

交換 :

in_array($it->getSubPath(), $file["exclude-directories"])

次のようなもので:

!in_array_beginning_with($it->getSubPath(), $file["exclude-directories"])

そして、関数を実装します:

function in_array_beginning_with($path, $array) {
  foreach ($array as $begin) {
    if (strncmp($path, $begin, strlen($begin)) == 0) {
      return true;
    }
  }
  return false;
}

しかし、それは非常に良い方法ではありません。なぜなら、それらが非常に大きくて深い場合でも、役に立たないディレクトリに再帰的に入るからです。あなたの場合、古い学校の再帰関数を実行してディレクトリを読み取ることをお勧めします。

<?php

function directory_reader($dir, array $ignore = array (), array $deeps = array ())
{
    array_push($deeps, $dir);
    $fulldir = implode("/", $deeps) . "/";
    if (is_dir($fulldir))
    {
        if (($dh = opendir($fulldir)) !== false)
        {
            while (($file = readdir($dh)) !== false)
            {
                $fullpath = $fulldir . $file;
                if (in_array($fullpath, $ignore)) {
                    continue ;
                }

                // do something with fullpath
                echo $fullpath . "<br/>";

                if (is_dir($fullpath) && (strcmp($file, '.') != 0) && (strcmp($file, '..') != 0))
                {
                    directory_reader($file, $ignore, $deeps);
                }
            }
            closedir($dh);
        }
    }
    array_pop($deeps);
}

しようとするとdirectory_reader(".", array("aDirectoryToIngore"))、まったく読み込まれません。

于 2012-09-17T07:10:17.390 に答える