如何将每个文件名的一部分添加到由glob生成的数组中?

时间:2018-06-21 23:54:24

标签: php arrays

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

2 个答案:

答案 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;
}