如何在PHP中对超过一个月的文件进行排序?

时间:2014-10-17 03:09:28

标签: php sorting datetime glob usort

要对磁盘上的文件进行排序。

        'data/tsm/seasonal/tsm-2012-Apr-May-Jun.png', 
        'data/tsm/seasonal/tsm-2012-Jan-Feb-Mar.png', 
        'data/tsm/seasonal/tsm-2012-Jul-Aug-Sep.png', 
        'data/tsm/seasonal/tsm-2012-Oct-Nov-Dec.png', 
        'data/tsm/seasonal/tsm-2013-Apr-May-Jun.png', 
        'data/tsm/seasonal/tsm-2013-Jan-Feb-Mar.png'

我希望文件先按年份排序,然后按第一个月排序 例如。 4月'tsm-2012-Apr-May-Jun.tif',我希望它使用2012年4月进行分类。

        <?php
function filesInRange($datadir, $parameter, $start_date, $end_date, $format, $patternval{
    $matches=array();
    $good_files = array();
       if (is_Dir($datadir)) {    
           foreach (new DirectoryIterator($datadir) as $fileInfo) {
               $matches=array(); 
               if ( !$fileInfo->isDot() && $fileInfo->isFile() ) {
               //  create a date by parsing the file name
                   preg_match($patternval, $fileInfo->getFileName(), $matches);
                   if ($matches) { 
                        $filedate = DateTime::createFromFormat($format, $matches[0]);
                   }//  determine if it's between start and end date
                   if ($filedate >= $start_date && $filedate <= $end_date) {
                     $good_files[] = $datadir.$fileInfo->getFileName();
                   }
               }

            }
        }
        asort($good_files);
        return $good_files;  
}
function startend($timeper1, $timeper2, $formatse) {
    global $start; 
    global $end; 
    $start = DateTime::createFromFormat( $formatse,$timeper1);
    $end   = DateTime::createFromFormat( $formatse,$timeper2);
}

要调用这些函数,我会这样做。

$season = substr('2012-Jan-Feb-Mar', 0, -8); 
$season2 = substr('2013-Apr-May-Jun', 0, -8); 
startend($season, $season2, 'Y-M');
$allfiles = filesInRange( "data/tsm/seasonal/" , 'tsm', $start, $end, 'Y-M', '/(?<year>\d{4})-(?<month>\w{3})/' );

然后我使用foreach回显目录。

foreach ($allfiles as $filesfound) {
    echo '<a href="'. $filesfound.'">'. basename($filesfound). '</a>';
}
?>

不幸的是,未分类。

sean9999与我分享了此http://3v4l.org/WSaS3页面,但它没有帮助,但它提供了主意。

我想,我必须使用substr()修剪其他几个月,但它是一个数组。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

或者,由于您已经获得了值但未排序,因此您可以使用usort()进行自定义排序。您需要先将这些月份转换为月份数。

粗略的例子:

$allfiles = ['data/tsm/seasonal/tsm-2012-Apr-May-Jun.png', 'data/tsm/seasonal/tsm-2012-Jan-Feb-Mar.png', 'data/tsm/seasonal/tsm-2012-Jul-Aug-Sep.png', 'data/tsm/seasonal/tsm-2012-Oct-Nov-Dec.png', 'data/tsm/seasonal/tsm-2013-Apr-May-Jun.png', 'data/tsm/seasonal/tsm-2013-Jan-Feb-Mar.png'];
usort($allfiles, function($a, $b){
    $a_base = explode('-', ltrim(basename($a, '.png'), 'tsm-')); // trim those uneeded string parts
    $b_base = explode('-', ltrim(basename($b, '.png'), 'tsm-'));
    array_walk($a_base, 'change_months');
    array_walk($b_base, 'change_months'); // convert months to month number
    $a_base = (int) implode($a_base);
    $b_base = (int) implode($b_base); // glue them back again

    return $a_base - $b_base;
});

function change_months(&$val) {
    if(!is_numeric($val)) { // no need to convert the year
        $date_month = date_parse($val);
        $val = $date_month['month']; // get month number
        $val = ((strlen($val) == 1) ? '0'.$val : $val);
    }
}

echo '<pre>';
print_r($allfiles);

应该导致:

Array
(
    [0] => data/tsm/seasonal/tsm-2012-Jan-Feb-Mar.png
    [1] => data/tsm/seasonal/tsm-2012-Apr-May-Jun.png
    [2] => data/tsm/seasonal/tsm-2012-Jul-Aug-Sep.png
    [3] => data/tsm/seasonal/tsm-2012-Oct-Nov-Dec.png
    [4] => data/tsm/seasonal/tsm-2013-Jan-Feb-Mar.png
    [5] => data/tsm/seasonal/tsm-2013-Apr-May-Jun.png
)