2009-09-06 41 views
8

Tôi đang tạo một danh sách liệt kê tập lệnh PHP5 cho lighttpd. Trong một thư mục nhất định, tôi muốn có thể liệt kê các thư mục con trực tiếp và các tập tin (với các thông tin).Sắp xếp tệp bằng DirectoryIterator

Sau một tìm kiếm nhanh, DirectoryIterator có vẻ là người bạn của tôi:

foreach (new DirectoryIterator('.') as $file) 
{ 
    echo $file->getFilename() . '<br />'; 
} 

nhưng tôi muốn để có thể sắp xếp các file theo tên file, ngày tháng, mime-loại ... vv

Làm thế nào để làm điều này (với ArrayObject/ArrayIterator?)?

Cảm ơn

+1

câu hỏi hay, chỉ là những gì tôi đang tìm kiếm. –

Trả lời

2

Philipp W. đăng tải một ví dụ điển hình ở đây: http://php.oregonstate.edu/manual/en/directoryiterator.isfile.php

function cmpSPLFileInfo($splFileInfo1, $splFileInfo2) 
{ 
    return strcmp($splFileInfo1->getFileName(), $splFileInfo2->getFileName()); 
} 

class DirList extends RecursiveDirectoryIterator 
{ 
    private $dirArray; 

    public function __construct($p) 
    { 
     parent::__construct($p); 
     $this->dirArray = new ArrayObject(); 
     foreach($this as $item) 
     { 
      $this->dirArray->append($item); 
     } 
     $this->dirArray->uasort("cmpSPLFileInfo"); 
    } 

    public function getIterator() 
    { 
     return $this->dirArray->getIterator(); 
    } 

} 
+1

Vấn đề tôi đang tìm kiếm với điều này là dường như sắp xếp mọi thứ đúng cách, nhưng các phím số vẫn giữ nguyên. Điều này dường như làm cho một iteration foreach theo thứ tự ban đầu, mặc dù một print_r in tất cả mọi thứ theo thứ tự đúng. – enobrev

+0

* foreach * luôn theo thứ tự của mảng, nó không sắp xếp theo các phím số. – AndreKR

+0

thay đổi mã trên từ ** uasort() ** thành ** usort() ** để đặt lại các phím. – ryanwinchester

4

Trên giải pháp đã không làm việc cho tôi. Dưới đây là những gì tôi đề xuất:

class SortableDirectoryIterator implements IteratorAggregate 
{ 

    private $_storage; 

    public function __construct($path) 
    { 
    $this->_storage = new ArrayObject(); 

    $files = new DirectoryIterator($path); 
    foreach ($files as $file) { 
     $this->_storage->offsetSet($file->getFilename(), $file->getFileInfo()); 
    } 
    $this->_storage->uksort(
     function ($a, $b) { 
      return strcmp($a, $b); 
     } 
    ); 
    } 

    public function getIterator() 
    { 
    return $this->_storage->getIterator(); 
    } 

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