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和regex的组合,但我有点迷路了。。。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
感谢您的帮助。简单方法。您可以使用
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