按PHP文件名排序文件 - 2011年3月,2011年4月,2011年5月等

时间:2011-03-17 14:54:14

标签: php sorting file multidimensional-array filenames

我有一个文件目录,其中包含以下文件名:

  • 2008年8月Presentation.ppt
  • 2009年8月Presentation.pdf
  • 2010年8月演示文稿.pdf
  • 2008年2月Presentation.ppt
  • 2011年1月Presentation.pdf
  • 2010年3月Presentation.pdf
  • 2011年3月Presentation.pdf
  • 2007年3月Presentation.ppt
  • 2009年3月Presentation.ppt
  • 2006年11月Presentation.pdf
  • 2009年10月Presentation.ppt

我正在尝试对它们进行排序,以便它们以这种方式出现: 2011年3月的演讲

  • 2011年1月发布会
  • 2010年8月发布会
  • 2010年3月的演示文稿
  • 2009年10月发布会
  • 2009年8月发布会
  • 2009年3月发布会
  • 2008年8月发布会
  • 2007年3月发布会
  • 2006年11月的发言

到目前为止我正在使用此代码:

$linkdir="documents/presentations";
$dir=opendir("documents/presentations");
$files=array();

while (($file=readdir($dir)) !== false)
{
   if ($file != "." and $file != ".." and $file != "index.php")
   {
    array_push($files, $file);
   }
}

closedir($dir);

natcasesort($files);

$files=array_reverse($files);

foreach ($files as $file)
print "<li><a href='/$linkdir/$file' rel='external'>$file</a></li>";

甚至可以按照我想要的方式对文件进行排序吗?我尝试使用的所有代码只是按字母顺序返回列表。

如果无法执行此操作,是否有人可以建议重命名我的文件和代码以对其进行排序?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

您可以尝试使用usort(使用函数比较值)。然后,在您的函数中,将文件名转换为时间戳,使用preg_match从文件名中取出日期部分,然后strtotime将其转换为可比较的时间戳:

function date_sort_desc($a, $b)
{
  preg_match('/\w+ \d{4}/', $a, $matches_a);
  preg_match('/\w+ \d{4}/', $b, $matches_b);
  $timestamp_a = strtotime($matches_a[0]);
  $timestamp_b = strtotime($matches_b[0]);
  if ($timestamp_a == $timestamp_b) return 0;
  return $timestamp_a < $timestamp_b;
}

usort($files, 'date_sort_desc');

注意:此函数按降序排序,因此您不必执行array_reverse

答案 1 :(得分:1)

usort编写自定义比较函数。该比较函数将从文件名中提取月份名称,使用

将其转换为整数
array(
  'January' => 0,
  'February' => 1,
  'March' => 2,
  'April' => 3,
  'May' => 4,
  'June' => 5,
  'July' => 6,
  'August' => 7,
  'September' => 8,
  'October' => 9,
  'November' => 10,
  'December' => 11
);

并比较整数。

答案 2 :(得分:0)

我只是将文件重命名为yyyymm.xxx(2008年8月Presentation.ppt - &gt; 200808.ppt,2011年1月Presentation.pdf - &gt; 201101.pd等)格式。然后使用以下代码(只更改是添加month数组,print语句和sort方法)。

$linkdir="documents/presentations";
$dir=opendir("documents/presentations");
$files=array();

while (($file=readdir($dir)) !== false)
{
   if ($file != "." and $file != ".." and $file != "index.php")
   {
    array_push($files, $file);
   }
}

closedir($dir);

sort($files);

$files=array_reverse($files);
$months = array("","January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); 


foreach ($files as $file)
print "<li><a href='/$linkdir/$file' rel='external'>Presentation " . $months[(int)substr($file,3,2)] . " " . substr($file,0,4) . "</a></li>";