сортировка — Как сортировать файлы с более чем одним месяцем в PHP?

Файлы на диске должны быть отсортированы.

        '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 (), чтобы обрезать другие месяцы, но это массив.
Спасибо вам за помощь!

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
)
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]