Я пытался сортировать целую кучу папок, но мне не удалось получить многоуровневые работы, как я хочу.
У меня есть целая куча файлов 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/.
Я смог создать функцию для этого для всех видео в третьей папке, но я не знаю, как это сделать для папок на нескольких уровнях.
Вам потребуется рекурсивная функция для сканирования каталога рекурсивно.
Попробуйте следующий код. Код комментируется везде, где это необходимо.
$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;
}
Примечание. Код не проверен и является просто руководством для вас.