Sıralama dizin RecursiveDirectoryIterator kullanarak listeleme

3 Cevap php

I RecursiveDirectoryIterator kullanıyorum ve RecursiveIteratorIterator aşağıdaki gibi bir kod kullanarak ağaç listeleyen bir dosya oluşturmak için. Ben sıralanabilir listesine gerekir - ya da dizinleri sonra sadece alfabetik alfabetik dosyaları veya.

Herkes nasıl dosya listesini sıralamak için bana söyleyebilir misiniz?

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

3 Cevap

Bu yineleyici kendisini kullanarak mümkün değildir. Ben sıralama ama onunla sorun olduğu için hazily hatırladınız mı SO yere Iterator sınıfının bir uzantısı gördük.

Onlar Iterasyon gelen işaret olsa bile this question yardımıyla belki cevaplar?

Update: Here bazı cevaplar ile soruya bir dupe - kuşkusuz çok değil, ama!

Bir şekilde ya da başka bir yineleyici sıralamak için kullanabilecekleri birden fazla seçenek vardır. En iyi seçenek, yineleyici yineleyici çıkmak istiyorum ne içeriği, ve aslında gerçekten istediğiniz nasıl yineleyici çok veya az / ihtiyacını işlemek istiyorum tam olarak nasıl bir hayli bağlı olacaktır.

Yaklaşımlar değişiklik olur; SplHeap (veya Min, Max çeşitleri), SplPriorityQueue (belki dosya boyutu gibi şeyler için) gibi ya da sadece sarma sınıfların yararlanarak ArrayObject gibi bir şey sizin yineleyici kendi içeriğini sıralayabilirsiniz.

Ben bir örnek olarak SplHeap kullanacağız. Eğer RecursiveDirectoryIterator alfabetik ardından aşağıdaki gibi bir şey kullanılabilir tüm içeriğini düzenlemek istiyorum beri:

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;
}

Sıralamayı dosya ve klasörleri karıştırma, alfabetik:

./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

Ruempler burada büyük bir çözümü var:

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