Php 根据模式获取文件,并且仅获取最新的

Php 根据模式获取文件,并且仅获取最新的,php,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

我有一个任务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和regex的组合,但我有点迷路了。。。
感谢您的帮助。

简单方法。您可以使用
opendir()
将所有相关文件名放入一个数组,然后使用
sort()
这些值。然后,您可以使用
foreach()
遍历每个值,并获取带有给定前缀的第一个值,即以“mp\u bi\u rate”开头的第一个文件就是您想要的文件,以此类推

不过,这并不是真正可伸缩的,因为您必须对一个包含大量不相关名称的庞大数组进行排序,然后循环遍历大量不相关的值,以获得所需的三个文件名


一种更酷的方法。让我们一步一步地完成这项工作–首先,我们需要一种获取日期和文件前缀的方法。日期总是像“20140614”,是吗?总是一样长?然后,我们可以使用以下代码获得日期(在
$file
中给出了一个示例值)

在正则表达式上使用
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\u file
将按前缀保存最早的文件(例如
$max\u file['mp\u bi\u rate']


如果你想让事情变得有趣,你可以在
$prefix
的子字符串中使用
-13
,这样你就没有结尾下划线了

如果您有具有这种模式的文件,则很可能只需要获取作为最后一个修改的文件(可能在创建新文件后不会修改文件)

因此,您可以做的是:

<?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

<?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