我试图在我的10个子文件夹中获得所有XML文件并解析它们。要做到这一点,我有以下代码:
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;
}
}
问题是它只解析一个目录中的文件,完全忽略另一个目录。有什么想法如何使它解析所有目录中的所有文件?
您的脚本存在许多问题,主要围绕foreach
。
-
if(is_dir($folderName))
:变量$folderName
不存在。我认为你应该有$file
在那里。 -
ScanFiles::calculateEAXML($dir);
:您正在再次扫描同一目录,并且对响应不做任何操作。 -
$df = opendir($dir . $file);
:如果文件不是目录,您试图将其作为目录打开。 - 你的
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;
}
这就是glob的作用:
foreach (glob("*.xml") as $filename) {
// do sth with the file, $filename holds the current file
}