2015-03-03 110 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; 
    } 
); 

然後循環數組和顯示