[英]php - loop through a directory files and run script
我有一个简单的XML解析器,我想按顺序运行目录中的所有文件,我的问题是如何遍历所有xml文件并一个接一个地运行脚本。 而不是手动执行。
$string = file_get_contents('epgs/file1.xml'); // loop through all files
$xml = new SimpleXMLElement($string);
$events=$xml->xpath("/DVB-EPG/Service/Event");
if ($events) {
foreach ($events as $event) {
$id = $event["id"];
$start_date = $event["start"] ;
$name = $event->ShortEventDescriptor->EventName ;
$text = $event->ShortEventDescriptor->Text;
$values = array (
':event_id'=>$id,
':event_name'=>$name,
':event_desc'=>$text,
':start_date'=>$start_date
);
$stmt = $dbh->prepare ($sql);
$stmt->execute($values);
}
}
其中目录epgs具有多个文件:file1.xml,file2.xml,file3.xml等。
回答
$files = glob("epgs/*.xml");
foreach ($files as $file) {
//script...
}
尽管您的问题已经在评论中得到了回答,但我建议不要使用glob()
。 您可以改用SPL迭代器:
<?php
$folder = __DIR__;
$pattern = '/^.*\.xml$/';
$iterator = new RecursiveDirectoryIterator($folder);
$iterator = new RecursiveIteratorIterator($iterator);
$iterator = new RegexIterator($iterator, $pattern);
$files = [];
foreach ($iterator as $file) {
$files []= $file->getFilename();
}
var_dump($files);
即使代码更大,我仍然发现它更有用。 好处如下:
您将获得绝对路径,期间。 使用glob()
,只有当您的原始模式也是绝对的情况下也是如此。 这不是很明显,不是吗?
实际上,您可以获得有关绝对路径的更多信息-您可以检查文件大小,其所有者等。请查看SplFileInfo上的文档 。
第二步,您发现自己需要处理递归模式,例如:
folder/*.xml folder/branch/*.xml folder/even/deeper/*.xml
...您将意识到PHP中没有内置的递归glob()
。
glob()
比简单*
支持更多的模式。 不幸的是,它们几乎没有记录在案 :
glob()函数根据libc glob()函数所使用的规则搜索所有与模式匹配的路径名,该规则类似于普通shell所使用的规则。
您是否真的要依赖可以因任何原因而改变的libc
实现?
在某些随机Blog™上, glob()
实际上支持的模式似乎描述得最好:
*
(星号)匹配零个更多字符。
?
完全匹配任何一个字符。
[...]
匹配组中的一个字符。 组可以是字符列表,例如
[afkp]
或字符范围,例如[ag]
,与[abcdefg]
相同。
[!...]
匹配不在组中的任何单个字符。
[!a-zA-Z0-9]
与任何非字母数字字符匹配。
\\
转义下一个字符。 对于特殊字符,这将导致它们不被视为特殊字符。 例如,
\\[
与文字[
匹配。 如果标志包括GLOB_NOESCAPE
,则禁用此引号,并将\\
作为简单字符处理。
对我来说,使用正则表达式更具可读性。 如果人们看到简单的正则表达式,则很少需要参考文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.