2015-10-13 100 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 
}