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

时间:2014-04-02 09:32:39

标签: php

我有一个简单的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等。

ANSWER

$files = glob("epgs/*.xml");
foreach ($files as $file) {
 //script... 
 }

1 个答案:

答案 0 :(得分:1)

虽然您的问题已在评论中得到解答,但我建议您不要使用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. 实际上,您可以获得更多关于绝对路径的信息 - 您可以检查文件大小,所有者等。检查documentation on SplFileInfo

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

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

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

  4. glob()支持的模式多于简单*。不幸的是,它们是barely documented

      

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

    您是否真的想依赖libc实施可能因任何原因而改变?

  5. some random blog™上似乎最好地描述了glob()实际支持的模式:

      

    *(星号)

         
        

    匹配零个多个字符。

      
         

    ?

         
        

    完全匹配任何一个字符。

      
         

    [...]

         
        

    匹配组中的一个字符。一个组可以是一个字符列表,例如[afkp]或一系列字符,例如[a-g][abcdefg]相同。

      
         

    [!...]

         
        

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

      
         

    \

         
        

    逃离下一个角色。对于特殊字符,这会导致它们不被视为特殊字符。例如,\[与文字[匹配。如果标记包含GLOB_NOESCAPE,则此引用将被禁用,\将作为简单字符处理。

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