繁体   English   中英

php-遍历目录文件并运行脚本

[英]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);

即使代码更大,我仍然发现它更有用。 好处如下:

  1. 您将获得绝对路径,期间。 使用glob() ,只有当您的原始模式也是绝对的情况下也是如此。 这不是很明显,不是吗?

  2. 实际上,您可以获得有关绝对路径的更多信息-您可以检查文件大小,其所有者等。请查看SplFileInfo上的文档

  3. 第二步,您发现自己需要处理递归模式,例如:

     folder/*.xml folder/branch/*.xml folder/even/deeper/*.xml 

    ...您将意识到PHP中没有内置的递归glob()

  4. glob()比简单*支持更多的模式。 不幸的是,它们几乎没有记录在案

    glob()函数根据libc glob()函数所使用的规则搜索所有与模式匹配的路径名,该规则类似于普通shell所使用的规则。

    您是否真的要依赖可以因任何原因而改变的libc实现?

  5. 某些随机Blog™上, glob()实际上支持的模式似乎描述得最好:

    * (星号)

    匹配零个更多字符。

    ?

    完全匹配任何一个字符。

    [...]

    匹配组中的一个字符。 组可以是字符列表,例如[afkp]或字符范围,例如[ag] ,与[abcdefg]相同。

    [!...]

    匹配不在组中的任何单个字符。 [!a-zA-Z0-9]与任何非字母数字字符匹配。

    \\

    转义下一个字符。 对于特殊字符,这将导致它们不被视为特殊字符。 例如, \\[与文字[匹配。 如果标志包括GLOB_NOESCAPE ,则禁用此引号,并将\\作为简单字符处理。

  6. 对我来说,使用正则表达式更具可读性。 如果人们看到简单的正则表达式,则很少需要参考文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM