我将结果从递归目录列表中拉到数组中,并且想知道是否有更好的(读取更快,简洁等等。)方式。具体来说,我正在创建一个数组:
path_relative_to_somedir => absolute_path
现在我有:
$map = array();
$base_realpath = realpath('/path/to/dir');
$iterator = new \RecursiveDirectoryIterator($base_realpath);
foreach((new \RecursiveIteratorIterator($iterator)) as $node){
$node_realpath = $node->getRealpath();
$map[substr($node_realpath, strlen($base_realpath) + 1)] = $node_realpath;
}
这很好(貌似),但我担心边缘情况,虽然我确信它们会在测试中出现,但其他人可能会指出。所以:
$base_realpath
的节点路径?glob()
或readdir()
等选项视为更快的替代方案吗? (这是一个有点时间敏感的操作,我在PHP中看到了一个与PHP中的目录递归有关的问题,在回答中会有一些基准,会在找到时链接)- 问题结束 -
- 可能不必要的细节开始 -
目的;我正在为应用程序创建虚拟工作目录,以便对给定文件的调用映射到实际文件。例如:( 我正在详细说明如果有人根据我实际做的事情总体上有更好的替代方法)
鉴于dir1
是虚拟工作目录的“根”,我们希望合并到dir2
:
path/ path/
| |
+-- to/ +-- to/
| |
+-- dir1/ +-- dir2/
| |
+-- script1.php +-- script2.php
| |
+-- script2.php +-- subdir/
| |
+-- subdir/ +-- script4.php
|
+-- script3.php
它会产生如下数组:
[script1.php] => path/to/dir1/script1.php
[script2.php] => path/to/dir2/script2.php
[subdir/script3.php] => path/to/dir1/subdir/script3.php
[subdir/script4.php] => path/to/dir2/subdir/script4.php
请注意,合并会替换现有的相对路径,并且每个元素都会映射到它的实际路径。我只是在这里使用array_replace()
,这是方法片段:
public function mergeModule($name){
$path = realpath($this->_application->getPath() . 'modules/' . $name);
if(!is_dir($path) || !is_readable($path)){
// @todo; throw exception
}
$map = array();
try{
$directory_iterator = new \RecursiveDirectoryIterator($path);
foreach((new \RecursiveIteratorIterator($directory_iterator)) as $node){
$node_realpath = $node->getRealpath();
$map[substr($node_realpath, strlen($path) + 1)] = $node_realpath;
}
}catch(\Exception $exception){
// @todo; handle
}
$this->_map = array_replace($this->_map, $map);
}
答案 0 :(得分:0)
如果您正在寻找以递归方式列出目录的更快方法,则可以尝试使用外部程序。快得多:)
exec('tree -if /var/www',$tree);
foreach($tree as $key => $path) {
if ( !$path ) // Ignore the summary ex "5 directories, 30 files"
break;
// Do something with the file/dir path
}
如果您只需要.php文件,则可以使用find命令。
find . -name "*.php"