0
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"

4

2 回答 2

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,这将允许您展平函数中的逻辑,使其成为非递归的。

于 2011-07-22T06:03:28.013 回答
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 );
    }
}
于 2011-07-22T06:13:39.717 回答