PHP自定义数组按年份和月份排序文件名,最新的第一个

时间:2011-02-23 16:50:01

标签: php arrays sorting

我有一个看起来像这样的文件数组:

array (
  0 => 'scpt-01-2010.phtml',
  1 => 'scpt-01-2011.phtml',
  2 => 'scpt-02-2010.phtml',
  3 => 'scpt-02-2011.phtml',
  4 => 'scpt-03-2010.phtml',
  5 => 'scpt-04-2010.phtml',
  6 => 'scpt-05-2010.phtml',
  7 => 'scpt-06-2010.phtml',
  8 => 'scpt-07-2010.phtml',
  9 => 'scpt-08-2010.phtml',
  10 => 'scpt-09-2010.phtml',
  11 => 'scpt-10-2010.phtml',
  12 => 'scpt-11-2010.phtml',
  13 => 'scpt-12-2010.phtml',
);

如何对其进行排序,以便2011年的文件按月排序(因此它应以 scpt-02-2011.phtml 引导)?

我已经尝试过主要的排序功能,比如natsort,rsort,arsort等,但是我没有快速到达任何地方!

提前致谢。

3 个答案:

答案 0 :(得分:1)

function customSort($a, $b) {
    // extract the values with a simple regular expression
    preg_match('/scpt-(\d{2})-(\d{4})\.phtml/i', $a, $matches1);
    preg_match('/scpt-(\d{2})-(\d{4})\.phtml/i', $b, $matches2);

    // if the years are equal, compare by month
    if ($matches2[2] == $matches1[2]) {
        return $matches2[1] - $matches1[1];
    // otherwise, compare by year
    } else {
        return $matches2[2] - $matches1[2];
    }
}

// sort the array
usort($array, 'customSort');

此方法使用usort()对数组进行排序,并传递比较函数的名称。

http://php.net/usort

答案 1 :(得分:0)

使用usort(),它允许您编写自己的回调并按自己的方式排序。

答案 2 :(得分:0)

无需为此任务推出正则表达式引擎。您需要爆炸连字符,以相反的顺序比较元素,然后以降序排序。只要您理解[...document.querySelectorAll('input[type=text]')].forEach(input => ; input.classList.add("browser-default")); 的意思是“降序排列”,以下内容就可以按照字面意思进行翻译。由于所有文件扩展名都相同,因此扩展名可能会附加到年份值上,而不会影响准确性。

代码:(Demo

return $b <=> $a;

输出:

$files = [
  0 => 'scpt-01-2010.phtml',
  1 => 'scpt-01-2011.phtml',
  2 => 'scpt-02-2010.phtml',
  3 => 'scpt-02-2011.phtml',
  4 => 'scpt-03-2010.phtml',
  5 => 'scpt-04-2010.phtml',
  6 => 'scpt-05-2010.phtml',
  7 => 'scpt-06-2010.phtml',
  8 => 'scpt-07-2010.phtml',
  9 => 'scpt-08-2010.phtml',
  10 => 'scpt-09-2010.phtml',
  11 => 'scpt-10-2010.phtml',
  12 => 'scpt-11-2010.phtml',
  13 => 'scpt-12-2010.phtml',
];

usort($files, function ($a, $b) {
   return array_reverse(explode('-', $b, 3)) <=> array_reverse(explode('-', $a, 3));
});
var_export($files);

换句话说,对于array ( 0 => 'scpt-02-2011.phtml', 1 => 'scpt-01-2011.phtml', 2 => 'scpt-12-2010.phtml', 3 => 'scpt-11-2010.phtml', 4 => 'scpt-10-2010.phtml', 5 => 'scpt-09-2010.phtml', 6 => 'scpt-08-2010.phtml', 7 => 'scpt-07-2010.phtml', 8 => 'scpt-06-2010.phtml', 9 => 'scpt-05-2010.phtml', 10 => 'scpt-04-2010.phtml', 11 => 'scpt-03-2010.phtml', 12 => 'scpt-02-2010.phtml', 13 => 'scpt-01-2010.phtml', ) 这样的文件,爆炸会创建:

scpt-02-2011.phtml

然后将其反转为:

['scpt', '02', '2011.phtml']

然后将每个元素以DESC方式逐步与另一个文件名的相应元素进行比较。