2010-04-19 75 views
41

Tôi hiện có tệp index.php cho phép tôi xuất danh sách tệp trong cùng thư mục, đầu ra hiển thị tên sau đó tôi đã sử dụng hàm filemtime() để hiển thị ngày khi tệp đã được sửa đổi. vấn đề của tôi bây giờ là, làm thế nào tôi sẽ sắp xếp đầu ra để hiển thị các tập tin sửa đổi mới nhất ?, Tôi đã suy nghĩ một lúc làm thế nào để làm điều này. nếu chỉ tôi làm điều đó với tương tác mysql thì sẽ không có vấn đề gì cả. xin vui lòng chỉ cho tôi một ví dụ làm thế nào để sắp xếp và xuất danh sách các tập tin bắt đầu từ một sửa đổi mới nhất. đây là những gì tôi có bây giờsắp xếp tệp theo ngày trong PHP

if ($handle = opendir('.')) { 
while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != "..") { 
     $lastModified = date('F d Y, H:i:s',filemtime($file)); 
      if(strlen($file)-strpos($file,".swf")== 4){ 
      echo "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>"; 
      } 
     } 
    } 
    closedir($handle); 
} 

Trả lời

19

Bạn cần phải đặt các tệp vào một mảng để sắp xếp và tìm tệp được sửa đổi lần cuối.

$files = array(); 
if ($handle = opendir('.')) { 
    while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != "..") { 
      $files[filemtime($file)] = $file; 
     } 
    } 
    closedir($handle); 

    // sort 
    ksort($files); 
    // find the last modification 
    $reallyLastModified = end($files); 

    foreach($files as $file) { 
     $lastModified = date('F d Y, H:i:s',filemtime($file)); 
     if(strlen($file)-strpos($file,".swf")== 4){ 
      if ($file == $reallyLastModified) { 
      // do stuff for the real last modified file 
      } 
      echo "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>"; 
     } 
    } 
} 

Không được thử nghiệm, nhưng đó là cách thực hiện.

+14

@sasori lưu ý rằng giải pháp này sẽ không hoạt động đúng cách khi bạn có các tệp có cùng thời gian, vì nó sẽ ghi đè lên tên tệp trước đó cho thời gian đó. – Gordon

+2

Chính xác Gordon, tôi ước rằng sẽ có một cách để BUMP nhận xét được hiển thị rõ hơn vì tôi đã dành một giờ đào sâu vào những gì đã sai .. Rõ ràng, ý tưởng đằng sau mã trên là chính xác, nhưng lỗi này làm cho nó hoàn toàn vô dụng . –

+0

Đã chỉnh sửa mã để tạo khóa duy nhất (bằng cách lặp lại thêm một giây). Nó sẽ gây nhầm lẫn mọi thứ một chút khi một số tập tin có một giây khác nhau (nhưng không giống hệt), nhưng điều đó sẽ không thành vấn đề trong hầu hết các trường hợp. –

137

này sẽ nhận được tất cả các file trong path/to/file với phần mở rộng .swf vào một mảng và sau đó sắp xếp mảng bởi mtime của tập tin

$files = glob('path/to/files/*.swf'); 
usort($files, function($a, $b) { 
    return filemtime($a) < filemtime($b); 
}); 

Các ở trên sử dụng một số Lambda function và yêu cầu PHP 5.3. Trước 5.3, bạn sẽ làm gì

usort($files, create_function('$a,$b', 'return filemtime($a)<filemtime($b);')); 

Nếu bạn không muốn sử dụng một chức năng ẩn danh, bạn chỉ cần cũng có thể xác định gọi lại như một chức năng thường xuyên và vượt qua các tên hàm để usort để thay thế.

Với mảng kết quả, sau đó bạn sẽ lặp qua các tập tin như thế này:

foreach($files as $file){ 
    printf('<tr><td><input type="checkbox" name="box[]"></td> 
      <td><a href="%1$s" target="_blank">%1$s</a></td> 
      <td>%2$s</td></tr>', 
      $file, // or basename($file) for just the filename w\out path 
      date('F d Y, H:i:s', filemtime($file))); 
} 

Lưu ý rằng vì bạn đã gọi filemtime khi sắp xếp các tập tin, không có thêm chi phí khi gọi nó một lần nữa trong foreach vòng lặp do stat cache.

+2

-1 Bạn không sử dụng mã của mình và usort là hàm sắp xếp tồi tệ nhất để sử dụng trong trường hợp đó. Nhưng địa ngục, tất cả bỏ phiếu cho bạn bởi vì nó trông lạ mắt. * - * – elias

+30

@elias Không có hành vi phạm tội, nhưng tôi thấy nó khá ngớ ngẩn để downvote một câu trả lời hoàn toàn hợp lệ cho những lý do bạn đưa ra. Nói về khả năng đọc mã của bạn mất nhiều thời gian để tìm ra hơn tôi. Tôi gọi nó là mã Spaghetti. Và nếu bạn không hài lòng về usort được oh khủng khiếp như vậy, hơn là nộp đơn khiếu nại với PHP's bugtracker. – Gordon

+0

Cấp câu hỏi này là aeons cũ, tôi sắp sử dụng 'usort()' ngay bây giờ; cầu nguyện, vấn đề với 'usort()' là gì? (Liên quan đến bình luận @elias ở trên.) –

8

Ví dụ sử dụng lớp RecursiveDirectoryIterator, đây là cách thuận tiện để lặp lại đệ quy qua hệ thống tệp.

$output = array(); 
foreach(new RecursiveIteratorIterator( 
    new RecursiveDirectoryIterator('path', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS)) as $value) {  
     if ($value->isFile()) { 
      $output[] = array($value->getMTime(), $value->getRealPath()); 
     } 
} 

usort ($output, function($a, $b) { 
    return $a[0] > $b[0]; 
}); 
+0

mọi người cần phải áp dụng phương pháp tiếp cận OOP trong PHP để làm cho nó cạnh tranh với các ngôn ngữ khác. –

+1

@RaheelKhan Tại sao? Sử dụng OOP khi nó giải quyết vấn đề dễ dàng hơn, không sử dụng OOP khi nó phức tạp hơn. OOP không làm bất cứ điều gì tốt hơn, cũng không phải mã của bạn, cũng không phải ngôn ngữ. Nó chỉ cho phép một số vấn đề để giải quyết hiệu quả hơn (những gì tôi không nghĩ là trường hợp ở đây). –

+0

+1 cho '>'; Tôi không hiểu tại sao các câu trả lời khác lại thất bại khi mã của tôi có liên quan, nhưng bạn đã thành công. Chỉ cần toán tử so sánh đúng: '>' thay vì '<'. – 1111161171159459134

0

Tôi sử dụng mã được đề xuất chính xác của bạn chỉ với một vài dòng bổ sung. Ý tưởng ít nhiều giống với ý tưởng được đề xuất bởi @elias, nhưng trong giải pháp này không thể có mâu thuẫn trên các khóa vì mỗi tệp trong thư mục có tên tệp khác và do đó thêm nó vào khóa giải quyết xung đột. Phần đầu tiên của khóa là chuỗi datetime được định dạng theo cách sao cho tôi có thể so sánh từ điển hai trong số chúng.

if ($handle = opendir('.')) { 
    $result = array(); 
    while (false !== ($file = readdir($handle))) { 
     if ($file != "." && $file != "..") { 
      $lastModified = date('F d Y, H:i:s',filemtime($file)); 
      if(strlen($file)-strpos($file,".swf")== 4){ 
       $result [date('Y-m-d H:i:s',filemtime($file)).$file] = 
        "<tr><td><input type=\"checkbox\" name=\"box[]\"></td><td><a href=\"$file\" target=\"_blank\">$file</a></td><td>$lastModified</td></tr>"; 
      } 
     } 
    } 
    closedir($handle); 
    krsort($result); 
    echo implode('', $result); 
} 
-1

$ files = array_diff (scandir ($ dir, SCANDIR_SORT_DESCENDING), mảng ('..', '.')); print_r ($ files);

Các vấn đề liên quan