从文件夹结构中的文件列表创建数组 - PHP

时间:2015-11-11 05:33:35

标签: php scandir

我一直试图整理一大堆文件夹,但却无法以我想要的方式运行多层次。

我有一大堆MP4文件,分散在多层目录结构中,我需要一个只包含其中包含MP4文件的文件夹列表的数组。

所以这里是一个文件夹和文件列表,例如。

/videos/
/videos/2015-11-09/
/videos/2015-11-09/device-1/
/videos/2015-11-09/device-1/110519/
/videos/2015-11-09/device-1/110519/Video-001.MP4
/videos/2015-11-09/device-1/110519/Video-002.MP4
/videos/2015-11-09/device-1/134852/Video-003.MP4
/videos/2015-11-09/device-2/
/videos/2015-11-09/device-2/094516/
/videos/2015-11-09/device-2/094516/Video-001.MP4
/videos/2015-11-09/device-2/094516/Video-002.MP4
/videos/2015-11-10/
/videos/2015-11-10/device-1/
/videos/2015-11-10/device-1/214537/Video-004.MP4
/videos/2015-11-10/device-1/214537/Video-005.MP4
/videos/2015-11-10/device-4/
/videos/2015-11-10/device-4/Video02-001.MP4
/videos/2015-11-10/device-4/Video02-002.MP4
/videos/2015-11-10/Video01-001.MP4
/videos/2015-11-10/Video01-002.MP4
/videos/2015-11-10/Video01-003.MP4

我想要一个php函数来查看这些,使用scandir()。

我已经构建了一些函数来删除隐藏文件,以及除结果中的.MP4之外的其他所有内容。

$HiddenFileFilter = function($a) {
    return $a[0] != ".";
};

$FileFilter = function($a) {
    if (strpos($a,'.MP4') !== false) {
        return $a;
    }
};

$ScandirFilteredResults = array_filter(scandir($Dir), $FileFilter);

我想要的结果是其中包含.MP4文件的目录,而且还有filemtime()的MP4文件对每个文件夹都有好处。

Array (
    [/videos/2015-11-09/device-1/110519/] => Array (
        [filemtime] => FILE_M_TIME
        [MP4] => Array (
            [0] => Video-001.MP4
            [1] => Video-002.MP4
        )
    )
    [/videos/2015-11-09/device-1/134852/] => Array (
        [filemtime] => FILE_M_TIME
        [MP4] => Array (
            [0] => Video01-003.MP4
        )
    )
    [/videos/2015-11-09/device-2/094516/] => Array (
        [filemtime] => FILE_M_TIME
        [MP4] => Array (
            [0] => Video-001.MP4
            [1] => Video-002.MP4
        )
    )
    [/videos/2015-11-10/device-1/214537/] => Array (
        [filemtime] => FILE_M_TIME
        [MP4] => Array (
            [0] => Video01-004.MP4
            [1] => Video01-005.MP4
        )
    )
    [/videos/2015-11-10/device-4/] => Array (
        [filemtime] => FILE_M_TIME
        [MP4] => Array (
            [0] => Video02-001.MP4
            [1] => Video02-002.MP4
        )
    )
    [/videos/2015-11-09/] => Array (
        [filemtime] => FILE_M_TIME
        [MP4] => Array (
            [0] => Video01-001.MP4
            [1] => Video01-002.MP4
            [2] => Video01-003.MP4
        )
    )
)

我只想让里面有.MP4文件的文件夹与输入数组一起放在输出数组中。

可能会有6个级别的目录,需要列出。所以/ videos /.

中的任何内容

我已经能够为第三个文件夹中的所有视频构建一个函数来执行此操作,但我不知道如何为多个级别的文件夹执行此操作。

1 个答案:

答案 0 :(得分:0)

您需要一个递归函数来递归扫描目录。

尝试以下代码。必要时会对代码进行评论。

$all_mp4_files = ScandirRecursive($Dir);
print_r($all_mp4_files);


function ScandirRecursive($Dir){
    $file_list = array();
    $ScandirFilteredResults = scandir($Dir);
    foreach ($ScandirFilteredResults as $file){
        if ($file[0] !='.'){
            $full_file_name = $Dir . '/' .$file;
            if (is_dir($full_file_name)){ // if this is a directory scan the files inside it.
                // merge the sub directory with current
                $file_list = array_merge($file_list, ScandirRecursive($full_file_name));
            }else{
                if (strtoupper(pathinfo($full_file_name, PATHINFO_EXTENSION)) == 'MP4'){
                    //Build your array
                    $file_list[dirname($full_file_name)]['filemtime'][] = filemtime($full_file_name);
                    $file_list[dirname($full_file_name)]['MP4'][] = basename($full_file_name);
                }
            }
        }
    }
    return $file_list;
}

注意:代码未经过测试,只是您构建的指南。