function file_list($path){
$final_result=array();
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if (is_dir($path."/".$file)) {
//echo $path."/".$file."\n";//directory
return file_list($path."/".$file);
} else {
//echo $path."/".$file."\n"; //all file
if(stripos($path."/".$file,"playlist.data"))
{
//echo $path."/".$file."\n"; //file contains "list.data"
$content = file_get_contents($path."/".$file);
preg_match_all("/([0-9]*).txt,0/",$content, $matches);
$result=array_unique($matches[1]);
$final_result=array_merge($final_result,$result);
$final_result=array_unique($final_result);
sort($final_result);
return($final_result);
}
}
}
}
}
}
print_r(file_list($argv[1]));
list.data 这样的文件:
1.txt
3.txt
另一个 list.data 文件,如下所示:
2.txt
4.txt
所以结果应该是这样的数组:
Array(
[0]=>1
[1]=>2
[2]=>3
[3]=>4
)
我的目标是以递归方式搜索文件系统的指定目录,当我找到名为“list.data”的文件名时,我读取此文件并使用正则表达式过滤并将数组转换为$result
。因为我有多个“list.data”,所以我很想将每个$result
合并到$final_result
。但是这个脚本什么都没输。
任何人都可以告诉我file_list
功能有问题。
我在CLI模式下执行这个php脚本,如下所示: php.exe script.php“d:/ test / listdir”
答案 0 :(得分:4)
这是一个释义的伪代码版本,显示了递归合并逻辑:
function file_list($path) {
$result = array();
foreach ($path as $file) {
if (is_dir($file)) {
$result = array_merge($result, file_list($file));
} else {
$result[] = ...
}
}
return $result;
}
该函数总是返回一个数组,即使它是空的。浏览目录,将结果添加到$result
数组中。如果遇到子目录,则让file_list
通过它,将结果合并到当前的$result
数组中(因为file_list
返回结果数组)。最后,在处理完目录中的所有条目后,将结果列表返回给调用者(可能是file_list
本身)。
如果您想进行实验,请查看RecursiveDirectoryIterator
,这样可以让您在函数中展平逻辑,使其成为非递归的。
答案 1 :(得分:0)
做你想做的事情的最佳方式:让PHP为你递归。
$iter = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$path, FilesystemIterator::CURRENT_AS_FILEINFO ) );
$out = array();
foreach( $iter as $file )
{
if( $file->getBasename() == 'list.data' )
{
$listdata = file_get_contents( $file->getPathname() );
// do something with list.data
$out = array_merge( $listDataOutput, $out );
}
}