2015-11-11 85 views
1

我一直在嘗試通過一大堆文件夾進行排序,但一直無法按我想要的方式獲得多級別的工作。從文件夾結構中的文件列表中創建數組 - PHP

我有一大堆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文件,還具有filemtime(),將有利於每個文件夾。

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個級別的目錄需要列出。所以/視頻/中的任何內容。

我已經能夠構建一個函數來爲第三個文件夾中的所有視頻執行此操作,但我不知道如何爲多個文件夾執行此操作。

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

注:該代碼未經測試,僅供您構建。

相關問題