2011-10-04 50 views
15

Tôi đang sử dụng lớp học php DirectoryIterator để liệt kê các tệp trong một thư mục. Tuy nhiên, tôi không thể tìm ra cách dễ dàng để sắp xếp tệp theo ngày. Làm thế nào là thực hiện với DirectoryIteratorphp DirectoryIterator sắp xếp tệp theo ngày

<?php 
$dir = new DirectoryIterator('.'); 
    foreach ($dir as $fileinfo) {  
    echo $fileinfo->getFilename() . '<br>'; 
    } 
?> 

gì nếu tôi đặt tên cho tác phẩm của tôi như whatever_2342345345.ext nơi những con số đại diện cho thời gian trong mili giây vì vậy mỗi tập tin có một số duy nhất. Làm cách nào để chúng tôi có thể sắp xếp bằng cách xem các số sau dấu gạch dưới

Trả lời

20

Nếu bạn cần sắp xếp, tạo mảng và sắp xếp.

$files = array(); 
$dir = new DirectoryIterator('.'); 
foreach ($dir as $fileinfo) {  
    $files[$fileinfo->getMTime()][] = $fileinfo->getFilename(); 
} 

ksort($files); 

Điều này sẽ tạo một mảng với thời gian sửa đổi là khóa và một mảng tên tệp làm giá trị. Sau đó, sắp xếp thông qua ksort(), sẽ cung cấp cho bạn các tên tệp theo thứ tự thời gian được sửa đổi.

Nếu sau đó bạn muốn tái cấu trúc san bằng để một mảng tiêu chuẩn, bạn có thể sử dụng ...

$files = call_user_func_array('array_merge', $files); 
+10

Tôi phải nói rằng bạn có chút sai khi nói "Một trình vòng lặp tồn tại để thực hiện điều đó, lặp lại". Lặp đi lặp lại bởi bản chất của họ có thể thêm các tính năng lọc và đặt hàng. Thật vậy, mục đích của trình vòng lặp là cung cấp giao diện để lặp lại, nhưng định nghĩa này không hạn chế trình lặp để thực hiện một số công việc nội bộ với dữ liệu. – zerkms

+0

Ví dụ bạn đã cung cấp không hoạt động đối với tôi. Bạn đã thử à. Điều gì sẽ xảy ra nếu tôi đặt tên các tệp của mình như whatever_2342345345.ext nơi các con số thể hiện thời gian mà mỗi tệp có một số duy nhất. Làm thế nào chúng ta có thể sắp xếp bằng cách nhìn vào các con số sau dấu gạch dưới – Pinkie

+0

@Pinkie: Tôi đã không thử nó, nhưng lý thuyết phải chính xác. Bạn đã gặp lỗi gì? Bạn đang xem '$ files'? – alex

1

Trong trường hợp nhiều file có thời sửa đổi (cập nhật):

$files = array(); 
$mtimes = array(); 
$dir = new DirectoryIterator('.'); 
foreach($dir as $file){ 
    if(!$file->isFile()) 
    continue; 

    $mtime = $file->getMTime(); 

    if(!$mtimes[$mtime]){ 
    $files[$mtime.'.0'] = $file->getFilename(); 
    $mtimes[$mtime] = 1; 
    }else{ 
    $files[$mtime.'.'.$mtimes[$mtime]++] = $file->getFilename(); 
    } 
} 

ksort($files); 
1

Nếu bạn vẫn muốn truy cập tất cả dữ liệu có sẵn tại DirectoryIterator (ví dụ: isDot()getSize() v.v.) một cách có thể là lưu khóa Iterator trên mảng bạn sắp xếp và tìm kiếm DirectoryIterator sau đó.

$sorted_keys = array(); 
$dir_iterator = new DirectoryIterator('.'); 

foreach ($dir_iterator as $fileinfo) 
{ 
    $sorted_keys[$fileinfo->getMTime()] = $fileinfo->key(); 
} 

ksort($sorted_keys); 

/* Iterate `DirectoryIterator` as a sorted array */ 
foreach ($sorted_keys as $key) 
{ 
    $dir_iterator->seek($key); 
    $fileinfo = $dir_iterator->current(); 

    /* Use $fileinfo here as a normal DirectoryIterator */ 
    echo $fileinfo->getFilename() . ' ' . $fileinfo->getSize() . '<br>'; 
} 
Các vấn đề liên quan