2015-03-03 59 views
-4

嗨,我有PHP,它显示了我在dir中的所有文件,并使他们href。在输出我有像kpi_03.03.2015.html,kpi_02.03.2015.html等文件列表 我需要按日期排序输出为例。php排序文件列表

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="application/html; charset=utf-8" /> 
    </head> 
    <body> 
    <?php 
    if ($handle = opendir('/opt/nagios/share/kpi_backup')) { 
     while (false !== ($file = readdir($handle))) 
      { 
       if ($file != "." && $file != "..") 
       { 
        $thelist .= '<a href="'.$file.'">'.$file.'</a>'; 
       } 
      } 
     closedir($handle); 
     } 
echo "list of files:<br><br>"; 
echo $thelist; 
    ?> 
    </body> 
    </html> 

我试过很多像变种:

sort($thelist); 

for ($i=0; $i <= 4; $i++) 
    echo $thelist[$i]."<br \>"; 

但它不是为我工作。

+0

敏感请将电流输出和你预期的一个 – Rizier123 2015-03-03 11:05:40

+0

加载文件列表添加到一个数组,并使用[usort(HTTP:// PHP。 net/manual/en/function.usort.php)对数组进行排序。您可以在循环中使用已排序的数组。 – bansi 2015-03-03 11:07:36

+0

@ Rizier123 kpi_03.03.2015.html,kpi_02.03.2015.html,kpi_01.03.2015.html等我需要kpi_01.03.2015.html,kpi_02.03.2015.html,kpi_03.03.2015.html。 – dend 2015-03-03 11:09:16

回答

0

你可以不喜欢这样。

//Read the file list to array 
$thelist = array_diff(scandir('/opt/nagios/share/kpi_backup'), array('..', '.')); 

//use usort to sort 
usort(
    $thelist, 
    function ($a, $b) { 
     list($d,$m,$y) = sscanf($a, 'kpi_%d.%d.%d'); 
     $da = sprintf("%d%02d%02d",$y,$m,$d); 
     list($d,$m,$y) = sscanf($b, 'kpi_%d.%d.%d'); 
     $db = sprintf("%d%02d%02d",$y,$m,$d); 
     return $da>$db; 
    } 
); 

$print_list=''; 
foreach($thelist as $file){ 
    $print_list .= "<a href=\"$file\">$file</a>"; 
} 
echo $print_list; 

您可以在排序之前过滤数组。像下面

$thelist=array_filter(
    $thelist, 
    function($k){ 
     return !substr_compare($k,'.html',-5); 
    } 
); 

注:substr_compare是区分默认

+0

非常感谢,你能再帮忙吗?我只需要输出* .html文件 – dend 2015-03-03 12:08:31

+0

更新了我的答案。它显示如何过滤文件。 – bansi 2015-03-03 12:37:15

2

获取基础文件名列表中的数组和排序是

usort(
    $thelist 
    function ($a, $b) { 
     $list($d, $m, $y) = explode('.', trim(sscanf($a, 'kpi_[^h]'), '.')); 
     $dateA = $y . $m . $d; 
     $list($d, $m, $y) = explode('.', trim(sscanf($b, 'kpi_[^h]'), '.')); 
     $dateB = $y . $m . $d; 
     return $dateA > $dateB; 
    } 
); 

然后循环数组和显示