获取基于模式的文件,仅获取最新的文件

时间:2014-07-01 03:53:15

标签: php

我有一个ini PHP的任务,可以根据模式在目录中获取最新文件。因此目录中的文件如下所示:

  

/cpca/mp_bi_rate_20140616.xml

     

/cpca/mp_bi_rate_20140613.xml

     

/cpca/mp_bi_rate_20140609.xml

     

/cpca/mp_bi_rate_20140602.xml

     

/cpca/mp_bi_ihks_20140616.xml

     

/cpca/mp_bi_ihks_20140615.xml

     

/cpca/mp_bi_ihks_20140614.xml

     

/cpca/ca_puexp_20140611.xml

     

/cpca/ca_puexp_20140610.xml

     

/cpca/ca_puexp_20140609.xml

所以在这种情况下,我需要选择文件mp_bi_rate_20140616.xml,mp_bi_ihks_20140616.xml和ca_puexp_20140611.xml

也许我需要一个glob和一个正则表达式的组合,但我有点迷失在这里...... 谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

天真的方法。您可以将所有相关文件名放入包含opendir()然后sort()这些值的数组中。然后,您可以使用foreach()遍历每个值,并使用给定前缀获取第一个值,即第一个文件以" mp_bi_rate _"开头。是你想要的那个,等等。

但这并不是真正可扩展的,因为你必须对一个充满无关名称的巨大数组进行排序,然后循环大量不相关的值来获得你想要的三个文件名。


更酷的方法。让我们一步一步地做 - 首先,我们需要一种获取日期和文件前缀的方法。日期总是像" 20140614",是吗?它总是一样长吗?然后我们可以使用以下代码到达日期(给定$file中的示例值。)

$file = '/cpca/mp_bi_rate_20140609.xml';
$date = substr($file, -12, 8);
// Get everything before "20140609.xml"
$prefix = substr($file, 0, -12);

在正则表达式上使用substr()可以让我们更快,希望如此。您需要的只是为每个文件保留最大值,例如:

$max_date = array();
$max_file = array(); // array to keep the full file name
foreach($files as $file) {
   $date = substr($file, -12, 8);
   $prefix = substr($file, 0, -12);
   if(!isset($max_date[$prefix]) || $date > $max_date[$prefix]) {
       $max_date[$prefix] = $date;
       $max_file[$prefix] = $file;
   }
}
然后

$max_file将按前缀(例如$max_file['mp_bi_rate_']

保留最旧的文件

如果你想要的东西很花哨,你可以在-13的子广告中使用$prefix,这样你就不会有结尾的下划线。

答案 1 :(得分:0)

如果你有这种模式的文件,你很可能只需要获得被修改为最后一个文件的文件(可能在创建新文件后不会修改文件)。

所以你可以做的是:

<?php

  $files = glob('/cpca/mp_bi_rate_*.xml');

  array_multisort(array_map('filemtime', $files), SORT_NUMERIC, SORT_DESC, $files);

  echo $files[0]; // file that was modified as the last one

当然,因为你有3种模式而且你需要3个文件,所以你需要为每种模式做这些。