我有一个文件目录,其中包含以下文件名:
我正在尝试对它们进行排序,以便它们以这种方式出现: 2011年3月的演讲
到目前为止我正在使用此代码:
$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>";
甚至可以按照我想要的方式对文件进行排序吗?我尝试使用的所有代码只是按字母顺序返回列表。
如果无法执行此操作,是否有人可以建议重命名我的文件和代码以对其进行排序?
非常感谢任何帮助。
答案 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>";