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 file like this:

1.txt
3.txt

another list.data file like this:

2.txt
4.txt

so the result should be array like this:

Array(
    [0]=>1
    [1]=>2
    [2]=>3
    [3]=>4
)

I was aim to search the specified directory of the file system recursively,when I found file name called "list.data", I read this file and using regex to filter and array to $result. since I have more than one "list.data", I wannted to merge every $result to $final_result. but this script output nothing. can anybody tell me does something wrong with file_list function.

i am execute this php script in CLI mode like this: php.exe script.php "d:/test/listdir"

2 Answers 2

4

This is a paraphrased pseudo-code version showing the recursive merging logic:

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;
}

The function always returns an array, even if it's empty. Going through a directory, you add your results into the $result array. If you encounter a subdirectory, you let file_list go through it, merging the results into your current $result array (because file_list returns an array of results). Finally, after all entries in the directory have been handled, you return the list of results to the caller (which may be file_list itself).

If you feel like experimenting, look into the RecursiveDirectoryIterator, which would allow you to flatten the logic in your function, making it non-recursive.

Sign up to request clarification or add additional context in comments.

3 Comments

you need to put glob around $file
@cwallen As I said: paraphrased pseudo-code. I want to show the logic, not the particulars.
Sure. I just saw the code block and my brain looped a few times and figured it would take me all of < 50 characters to let you know.
0

Best way to do what you're trying to do: let PHP recurse for you.

$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 );
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.