Файлы на диске должны быть отсортированы.
'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'
Я хочу, чтобы файлы сортировались сначала по году, а затем по первому месяцу.
например. Апр для ‘tsm-2012-Apr-May-Jun.tif’, я хочу, чтобы он сортировался с использованием 2012-Apr.
<?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 (), чтобы обрезать другие месяцы, но это массив.
Спасибо вам за помощь!
Кроме того, поскольку вы уже получили значения, но не отсортировали, вы можете просто использовать пользовательскую сортировку, используя 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
)
Других решений пока нет …