PHP初学者在这里;这是一个基本的问题,搜索后我找不到关于SE的简单解释或示例。
根据barmar指出的问题进行了编辑。
我有很多文件的目录,即
2018-03-21-file-name.php
2018-07-04-file-name-too.php
2018-05-30-another-file-name.php
2018-07-04-file-too.php
... more
文件名中的数字字符串是日期,格式为yyyy-mm-dd。某些文件的日期可能相同。
我正在使用glob创建这些文件的数组
$files = (glob("*.php"));
和var_dump
向我显示了结果:
[0]=> string(18) "2018-03-21-file-name.php"
[1]=> string(22) "2018-07-04-file-name-too.php"
[2]=> string(25) "2018-05-30-another-file-name.php"
... more
文件自然按照glob的数字顺序排序;但我想按月对文件排序。但是为了做到这一点,我认为我需要从每个文件名中提取月份号,并将其插入每个相应文件名的$files
数组中。
那么如何从每个文件中获取月份号并将其添加到数组中,以便可以将文件分为几个月组?
这是我先前的问题Glob files and sort by filemtime and into months,在其中我按月份和日期按文件修改日期对jQuery手风琴进行了标记排序,但是我发现使用filemtime
存在问题,因此我需要更改为按实际文件名中的日期排序。
即
$files = (glob("*.php"));
krsort($files);
foreach ...
答案 0 :(得分:2)
可能最好的方法是定义自己的排序函数,并像这样使用usort()
:
$glob = ['03-05-18-file-name.php',
'30-11-18-file-name-too.php',
'21-08-18-another-file-name.php'];
function cmp($a, $b)
{
$month_a = substr($a,3,2);
$month_b = substr($b,3,2);
if ($month_a == $month_b) {
return 0;
}
return ($month_a < $month_b) ? -1 : 1;
}
usort($glob, "cmp");
print_r($glob);
请注意,所有月份都分组在一起。如果要分隔年或月的某几天,则需要修改cmp
函数。
答案 1 :(得分:1)
这是一种方法。
它使用正则表达式从文件名中删除日期,并将其用作数组 $ ordered 的键或索引。然后调用 krsort 。
$files = ['03-05-18-file-name.php','30-11-18-file-name-too.php','21-08-18-anothe
r-file-name.php'];
$ordered = [];
foreach ($files as $f) {
$dateKey = preg_replace('/^(\d+)-(\d+)-(\d+).*$/','$3$2$1',$f);
$ordered[$dateKey] = $f;
}
krsort($ordered);
var_dump($files,$ordered);
foreach ($ordered as $o) {
echo $o.PHP_EOL;
}