2010-05-28 40 views
13

Tôi đang sử dụng RecursiveDirectoryIteratorRecursiveIteratorIterator để tạo danh sách tệp bằng cách sử dụng mã như dưới đây. Tôi cần danh sách được sắp xếp - hoặc là thư mục rồi tệp theo thứ tự bảng chữ cái hoặc chỉ theo thứ tự bảng chữ cái.Sắp xếp danh sách thư mục bằng cách sử dụng RecursiveDirectoryIterator

Mọi người có thể cho tôi biết cách sắp xếp danh sách tệp không?

$dir_iterator = new RecursiveDirectoryIterator($groupDirectory); 
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST); 
foreach ($iterator as $file) { 
    // do stuff with $file 
} 
+0

có thể trùng lặp của [sau khi sử dụng $ files = new DirectoryIterator() trong PHP, làm thế nào để bạn sắp xếp các mục?] (Http://stackoverflow.com/questions/1076881/after-using-files-new-directoryiterator-in- php-how-do-you-sort-the-items) –

+0

[salathe/spl-ví dụ - Phân loại Iterators] (https://github.com/salathe/spl-examples/wiki/Sorting-Iterators) – hakre

Trả lời

1

Không thể sử dụng chính Iterator. Tôi đã thấy một phần mở rộng cho lớp Iterator một nơi nào đó trên SO đã phân loại nhưng nhớ một cách mơ hồ đã gặp rắc rối với nó.

Có thể câu trả lời cho số this question trợ giúp, mặc dù chúng chỉ cách xa Iterator?

Cập nhật: Here là một câu hỏi cho câu hỏi của bạn với một số câu trả lời - thừa nhận không nhiều, mặc dù!

+0

Dang. Tôi nghĩ những Iterator này thực sự sẽ giúp tôi. Cảm ơn Pekka. –

23

Có nhiều tùy chọn khả dụng, bạn có thể sử dụng tùy chọn này để sắp xếp trình lặp trong cách này hay cách khác. Tùy chọn tốt nhất sẽ phụ thuộc rất nhiều vào chính xác cách bạn muốn thao tác nội dung của trình vòng lặp, những gì bạn muốn thoát khỏi trình vòng lặp và thực sự là bao nhiêu hay ít của trình lặp mà bạn thực sự muốn/cần.

Phương pháp tiếp cận sẽ thay đổi; sử dụng các lớp như SplHeap (hoặc Min, Max giống), SplPriorityQueue (có thể cho những thứ như kích thước tệp) hoặc chỉ gói trình lặp của bạn theo thứ gì đó như ArrayObject có thể sắp xếp nội dung của riêng nó.

Tôi sẽ sử dụng ví dụ SplHeap. Vì bạn muốn sắp xếp toàn bộ nội dung của RecursiveDirectoryIterator theo thứ tự abc sau đó một cái gì đó như sau có thể được sử dụng:

class ExampleSortedIterator extends SplHeap 
{ 
    public function __construct(Iterator $iterator) 
    { 
     foreach ($iterator as $item) { 
      $this->insert($item); 
     } 
    } 
    public function compare($b,$a) 
    { 
     return strcmp($a->getRealpath(), $b->getRealpath()); 
    } 
} 

$dit = new RecursiveDirectoryIterator("./path/to/files"); 
$rit = new RecursiveIteratorIterator($dit); 
$sit = new ExampleSortedIterator($rit); 
foreach ($sit as $file) { 
    echo $file->getPathname() . PHP_EOL; 
} 

Trình tự sắp xếp là chữ cái, pha trộn các file và thư mục:

./apple 
./apple/alpha.txt 
./apple/bravo.txt 
./apple/charlie.txt 
./artichoke.txt 
./banana 
./banana/aardvark.txt 
./banana/bat.txt 
./banana/cat.txt 
./beans.txt 
./carrot.txt 
./cherry 
./cherry/amy.txt 
./cherry/brian.txt 
./cherry/charlie.txt 
./damson 
./damson/xray.txt 
./damson/yacht.txt 
./damson/zebra.txt 
./duck.txt 
+0

Cảm ơn bạn rất nhiều! – eisberg

0

Sönke Ruempler có một lớn giải pháp:

class SortingIterator implements IteratorAggregate 
{ 

     private $iterator = null; 

     public function __construct(Traversable $iterator, $callback) 
     { 
       if (!is_callable($callback)) { 
         throw new InvalidArgumentException('Given callback is not callable!'); 
       } 

       $array = iterator_to_array($iterator); 
       usort($array, $callback); 
       $this->iterator = new ArrayIterator($array); 
     } 


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

Nguồn: http://www.ruempler.eu/2008/08/09/php-sortingiterator

+2

Khi đăng liên kết dưới dạng câu trả lời, vui lòng bao gồm đủ nội dung mà câu trả lời hữu ích cho riêng mình, trong trường hợp liên kết bị gián đoạn sau đó. –

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