2015-10-13 2 views
0

Я пытаюсь получить все файлы XML в моих 10 подпапках и проанализировать их. Для этого у меня есть следующий код:PHP получение всех файлов в подкаталогах

public static function calculateEAXML ($dir) { 
$dh = opendir($dir); 
$folderNames = array(); 
$arr = array(); 
while (false !== ($folderName = readdir($dh))) { 
    if ($folderName[0] == "." || (substr($folderName, -3) == "zip")) {continue;} 
    $folderNames[] = $folderName; 
    $dom = new DOMDocument; 
    $dom->validateOnParse = true; 
    foreach ($folderNames as $file) 
{ 
    if(is_dir($folderName)){ScanFiles::calculateEAXML($dir);} 
    else{ 
    $df = opendir($dir . $file); 
    while (false !== ($file = readdir($df))) 
    { 
     if ($file == "." || $file == ".." ) {continue;} 
     $dom->Load($dir . $folderName . "/" . $file); 
     $arr[] = XML2Array::createArray($dom); 
    } 
    } 
} 
    return $arr;  
} 
} 

Дело в том, что он разбирает файлы только в ОДНОЙ директории, полностью игнорируя другую. Есть ли идеи, как заставить его анализировать все файлы во всех каталогах?

+1

может быть, это поможет: http://stackoverflow.com/a/1860417/5440709 – Kanti

ответ

0

Есть целый ряд проблем, связанных с вашим сценарием, главным образом вокруг foreach.

  1. if(is_dir($folderName)): Переменная $folderName не существует. Я бы предположил, что у вас должно быть $file.
  2. ScanFiles::calculateEAXML($dir);: Вы снова сканируете тот же каталог и ничего не делаете с ответом.
  3. $df = opendir($dir . $file);: Если файл не является каталогом, вы пытаетесь открыть его как каталог.
  4. Ваш цикл foreach находится внутри цикла while.

Вот попытка на фиксации этих проблем:

public static function calculateEAXML($dir) { 
    $dh = opendir($dir); 
    $folderNames = array(); 
    $arr = array(); 

    // Get all files and folders in the current directory 
    while (false !== ($folderName = readdir($dh))) { 
     if ($folderName[0] == "." || (substr($folderName, -3) == "zip")) { 
      continue; 
     } 
     $folderNames[] = $folderName; 
    } 

    foreach ($folderNames as $file) { 
     $filename = $dir . '/' . $file; 
     if(is_dir($filename)){ 
      $arr = array_merge($arr, ScanFiles::calculateEAXML($filename)); 
     } else { 
      $dom = new DOMDocument; 
      $dom->validateOnParse = true; 
      $dom->Load($filename); 
      $arr[] = XML2Array::createArray($dom); 
     } 
    } 
    return $arr;  
} 
+0

Очень большое спасибо! Работает так, как ожидалось !! – Jack

0

Это то, что glob для:

foreach (glob("*.xml") as $filename) { 
    // do sth with the file, $filename holds the current file 
}