Recursively sadece PHP5 RecursiveDirectoryIterator sınıfını kullanarak belirli dosya tipleri ile klasörleri ve alt klasörleri görüntülemek için nasıl

1 Cevap

Merhaba ben işe FilterIterator bir uzantısı kullanılarak RecursiveDirectoryIterator sınıf almaya çalışıyorum ama nedense sadece kök dizinde yineleme edilir.

benim kod budur.

    class fileTypeFilter extends FilterIterator
{
    public function __construct($path)
    {
        parent::__construct(new RecursiveDirectoryIterator($path));
    }  
    public function accept()
    {
        $file = $this->getInnerIterator()->current();
        return preg_match('/\.php/i', $file->getFilename());
    }    

}

$it = new RecursiveDirectoryIterator('./');
$it = new fileTypeFilter($it);

foreach ($it as $file)
{
    echo $file;
}

benim dizin yapısı bu gibi bir şeydir.

-Dir1
--file1.php
--file2.php
-Dir2
--file1.php

vs vs

Ben dersten önce dediğim gibi ardışık bütün dizin yapısı üzerinde yineleme değildir ve sadece kök bakıyor.

Soru klasörleri görüntülemek ve daha sonra sadece bu directorys içinde php dosyalarını göstermek için FilterIterator çalıştırmak için bir temel RescursiveDirectoryIterator kullanmak nasıl, nedir?

Şerefe

1 Cevap

The FilterIterator should accept another iterator through its constructor. In order for the automatic recursion to happen, you need to use a RecursiveIteratorIterator to iterate over the RecursiveIterator. You don't need to, but if you don't, then the burden of calling hasChildren() and getChildren() etc... is on you.

İşte bir örnek. Eğer regex değiştirmek mümkün istedim eğer güzel bir katkı olacaktır ancak ben, FileTypeFilterIterator için yapıcı herhangi bir argüman kabul için rahatsız etmedi. Ancak, aksi bir yapıcı tanımlamak gerekmez.

$it = new FileTypeFilterIterator (
    new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($path),
        RecursiveIteratorIterator::SELF_FIRST
    )
);


class FileTypeFilterIterator extends FilterIterator
{
    public function __construct(Iterator $iter)
    {
        parent::__construct($iter);
    }
    public function accept()
    {
        $file = $this->getInnerIterator()->current();
        return preg_match('/\.php/i', $file->getFilename());
    }

}
foreach($it as $name => $object){
    echo "$name\n";
}

Btw, bu durumda, siz de sadece yerine FilterIterator uzanan RegexIterator kullanabilirsiniz.