【问题标题】:Creating array from list of files in folder structure - PHP从文件夹结构中的文件列表创建数组 - PHP
【发布时间】:2015-11-11 05:33:35
【问题描述】:

我一直在尝试对一大堆文件夹进行排序,但无法让多级按我想要的方式工作。

我有一大堆 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 文件的文件夹连同其中的 MP4 文件一起出现在输出数组中。

可能有 6 层以下的目录需要列出。所以 /videos/ 中的任何内容。

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

【问题讨论】:

  • 创建一个构建数组的递归函数?

标签: php scandir


【解决方案1】:

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

试试下面的代码。代码会在必要时进行注释。

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

注意:代码未经测试,仅供您构建参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多