如何递归函数返回累积数组(array_merge)(php)

时间:2011-07-22 05:48:21

标签: php recursion array-merge

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”

2 个答案:

答案 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 );
    }
}