как функция рекурсии может вернуть накопительный массив (array_merge) (php) - PullRequest
0 голосов
/ 22 июля 2011
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 функцией.

Я выполняю этот скрипт php в режиме CLI следующим образом: php.exe script.php "d: / test / listdir"

Ответы [ 2 ]

4 голосов
/ 22 июля 2011

Это перефразированная версия псевдокода, показывающая рекурсивную логику слияния:

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, который позволит вам сгладить логику в вашей функции, сделав ее нерекурсивной.

0 голосов
/ 22 июля 2011

Лучший способ сделать то, что вы пытаетесь сделать: позвольте 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 );
    }
}
...