我有一个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和一个正则表达式的组合,但我有点迷失在这里...... 谢谢你的帮助
答案 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个文件,所以你需要为每种模式做这些。