如何获取指定路径的所有子目录的数组?

时间:2009-12-31 19:16:27

标签: php filesystems

例如,我有一个像这样的目录结构:

my_stuff
   classes
      one
      two
          more
          evenmore
              manymore
                  subsub
                      subsubsub
          otherstuff
          morestuff
              deepstuff
                  toomuch

我希望将类下的所有内容(!)添加到php include路径中。我怎么会得到这样的阵列?有没有一些花哨的php功能呢?

3 个答案:

答案 0 :(得分:6)

使用SplIterators可轻松递归遍历目录。你刚才做了

$path = realpath('.');

$elements = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path),
    RecursiveIteratorIterator::SELF_FIRST);

foreach($elements as $element){
    // element is an SplFileObject
    if($element->isDir()) { 
        echo "$element\n"; // do whatever
    }
}

但是,请勿将每个目录添加到包含路径。

如果将所有这些文件夹添加到包含路径,则会严重降低应用程序的速度。如果您的类在subsubsub中,PHP将首先搜索my_stuff,然后搜索类,然后搜索一个,然后搜索两个,依此类推。

而是让您的类名遵循PEAR约定并使用自动加载。

答案 1 :(得分:0)

不是我知道的。因此,您必须编写自己的递归函数,使用dir或类似函数。

但是,你真的想在某个地方缓存这些路径,因为这(至少对我来说)感觉就像是为每个前端页面加载执行不必要的资源密集型活动。 (例如,根据您过去所说的内容,您可能只需要在更改CMS中的逻辑时重新生成包含目录列表等。)

或者,您可以在中间级别生成负责包含较低级别项目的项目。 (如果您正在使用工厂模式等,这可能真的有意义,但可能并非如此。)

答案 2 :(得分:0)

function include_sub_dirs($path) {
    if (!isDirectory($path)) {
        trigger_error("'$path' is not a directory");
    }

    $old = get_include_path();

    foreach (scandir($path) as $subdir) {
        if (!is_directory($subdir)) continue;

        $path .= PATH_SEPARATOR . $path.DIRECTORY_SEPARATOR.$subdir;
        include_sub_dirs($subdir);
    }

    set_include_path($old . PATH_SEPARATOR . $path);

    return true;
}