Создание массива из списка файлов в структуре папок - PHP

1

Я пытался сортировать целую кучу папок, но мне не удалось получить многоуровневые работы, как я хочу.

У меня есть целая куча файлов 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, а файлы MP4, также имеющие файлmmm(), будут полезны для каждой папки.

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/.

Я смог создать функцию для этого для всех видео в третьей папке, но я не знаю, как это сделать для папок на нескольких уровнях.

  • 0
    создать рекурсивную функцию, которая создает массив?
Теги:
scandir

1 ответ

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

Примечание. Код не проверен и является просто руководством для вас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню