PHP Belirli bir dizinin tüm alt dizinlerini al


139

Belirli bir dizinin tüm alt dizinlerini dosyasız .(geçerli dizin) veya ..(üst dizin) olmadan nasıl alabilir ve her dizini bir işlevde nasıl kullanabilirim?

Yanıtlar:


210

seçeneği ile glob () kullanabilirsinizGLOB_ONLYDIR

veya

$dirs = array_filter(glob('*'), 'is_dir');
print_r( $dirs);

alt dizinleri de veriyor?
Gordon

2
Burada bir resursion yapmak zorundasınız
Josef Sábl

Üzgünüz, burada GLOB_ONLYDIR seçeneği nerede ??
developerbmw

5
@developerbmw veya sözcüğünü not edin . Hedefe ulaşmak için iki farklı yöntem sunar.
Ken Wayne VanderLinde

7
Hoş ve basit bir yaklaşım olsa da, kabul edilen cevap şu soruya cevap vermez: ana dizinden alt dizinler almak (mevcut çalışma dizininin kardeşleri olarak da bilinir). Bunu yapmak için çalışma dizinini üst dizine değiştirmeniz gerekir.
ryanm

156

GLOB ile yalnızca dizinleri nasıl alacağınız aşağıda açıklanmıştır:

$directories = glob($somePath . '/*' , GLOB_ONLYDIR);

2
Bu ana dizini de içerir.
user4951

3
Bu benim durumumda ana dizini içermiyor (Windows)
marcovtwout

1
Mac linux'da benim için ana dizini de içermiyor. Belki de kullanılan yolla ilgili?
Jake

1
Bu $somePath, çıktıdaki yolu da içerir
The Godfather

47

Spl DirectoryIterator sınıfı, dosya sistemi dizinlerinin içeriğini görüntülemek için basit bir arabirim sağlar.

$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
    if ($fileinfo->isDir() && !$fileinfo->isDot()) {
        echo $fileinfo->getFilename().'<br>';
    }
}

27

Önceki sorunuzdakiyle hemen hemen aynı :

$iterator = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($yourStartingPath), 
            RecursiveIteratorIterator::SELF_FIRST);

foreach($iterator as $file) {
    if($file->isDir()) {
        echo strtoupper($file->getRealpath()), PHP_EOL;
    }
}

strtoupperİstediğiniz işlevle değiştirin .


1
güzel, teşekkürler! bir soru daha: Yalnızca alt dizin adını tüm yoldan nasıl ayırabilirim?
Adrian

@Adrian Lütfen diğer sorunuzda verdiğim API belgelerine bir göz atın. getFilename()yalnızca dizin adını döndürür.
Gordon

1
Noktalardan kurtulmak için, kurucuya RecursiveDirectoryIterator::SKIP_DOTSikinci bir argüman olarak eklemek zorunda kaldım RecursiveDirectoryIterator.
colan

5

Bu kodu deneyin:

<?php
$path = '/var/www/html/project/somefolder';

$dirs = array();

// directory handle
$dir = dir($path);

while (false !== ($entry = $dir->read())) {
    if ($entry != '.' && $entry != '..') {
       if (is_dir($path . '/' .$entry)) {
            $dirs[] = $entry; 
       }
    }
}

echo "<pre>"; print_r($dirs); exit;

4

Dizide:

function expandDirectoriesMatrix($base_dir, $level = 0) {
    $directories = array();
    foreach(scandir($base_dir) as $file) {
        if($file == '.' || $file == '..') continue;
        $dir = $base_dir.DIRECTORY_SEPARATOR.$file;
        if(is_dir($dir)) {
            $directories[]= array(
                    'level' => $level
                    'name' => $file,
                    'path' => $dir,
                    'children' => expandDirectoriesMatrix($dir, $level +1)
            );
        }
    }
    return $directories;
}

//Giriş:

$dir = '/var/www/';
$directories = expandDirectoriesMatrix($dir);

echo $directories[0]['level']                // 0
echo $directories[0]['name']                 // pathA
echo $directories[0]['path']                 // /var/www/pathA
echo $directories[0]['children'][0]['name']  // subPathA1
echo $directories[0]['children'][0]['level'] // 1
echo $directories[0]['children'][1]['name']  // subPathA2
echo $directories[0]['children'][1]['level'] // 1

Tümünü göstermek için örnek:

function showDirectories($list, $parent = array())
{
    foreach ($list as $directory){
        $parent_name = count($parent) ? " parent: ({$parent['name']}" : '';
        $prefix = str_repeat('-', $directory['level']);
        echo "$prefix {$directory['name']} $parent_name <br/>";  // <-----------
        if(count($directory['children'])){
            // list the children directories
            showDirectories($directory['children'], $directory);
        }
    }
}

showDirectories($directories);

// pathA
// - subPathA1 (parent: pathA)
// -- subsubPathA11 (parent: subPathA1)
// - subPathA2 
// pathB
// pathC

2
<?php
    /*this will do what you asked for, it only returns the subdirectory names in a given
      path, and you can make hyperlinks and use them:
    */

    $yourStartingPath = "photos\\";
    $iterator = new RecursiveIteratorIterator( 
        new RecursiveDirectoryIterator($yourStartingPath),  
        RecursiveIteratorIterator::SELF_FIRST);

    foreach($iterator as $file) { 
        if($file->isDir()) { 
            $path = strtoupper($file->getRealpath()) ; 
            $path2 = PHP_EOL;
            $path3 = $path.$path2;

            $result = end(explode('/', $path3)); 

            echo "<br />". basename($result );
        } 
    } 

    /* best regards,
        Sanaan Barzinji
        Erbil
    */
?>

2

Bu işlevi deneyebilirsiniz (PHP 7 gerekir)

function getDirectories(string $path) : array
{
    $directories = [];
    $items = scandir($path);
    foreach ($items as $item) {
        if($item == '..' || $item == '.')
            continue;
        if(is_dir($path.'/'.$item))
            $directories[] = $item;
    }
    return $directories;
}

1

Doğru yol

/**
 * Get all of the directories within a given directory.
 *
 * @param  string  $directory
 * @return array
 */
function directories($directory)
{
    $glob = glob($directory . '/*');

    if($glob === false)
    {
        return array();
    }

    return array_filter($glob, function($dir) {
        return is_dir($dir);
    });
}

Esinlenen Laravel


1
Bir bayrak olduğunda bu aşırıya kaçmış gibi görünüyor GLOB_ONLYDIR, bkz. Php.net/manual/en/function.glob.php
Robert Pounder

0

Bu bir astar kodu:

 $sub_directories = array_map('basename', glob($directory_path . '/*', GLOB_ONLYDIR));

0

Özyinelemesiz Yalnızca Dizinleri Listele

Doğrudan sorulan tek soru yanlışlıkla kapatıldı, bu yüzden buraya koymak zorundayım.

Ayrıca dizinleri filtreleme yeteneği verir.

/**
 * Copyright © 2020 Theodore R. Smith <https://www.phpexperts.pro/>
 * License: MIT
 *
 * @see https://stackoverflow.com/a/61168906/430062
 *
 * @param string $path
 * @param bool   $recursive Default: false
 * @param array  $filtered  Default: [., ..]
 * @return array
 */
function getDirs($path, $recursive = false, array $filtered = [])
{
    if (!is_dir($path)) {
        throw new RuntimeException("$path does not exist.");
    }

    $filtered += ['.', '..'];

    $dirs = [];
    $d = dir($path);
    while (($entry = $d->read()) !== false) {
        if (is_dir("$path/$entry") && !in_array($entry, $filtered)) {
            $dirs[] = $entry;

            if ($recursive) {
                $newDirs = getDirs("$path/$entry");
                foreach ($newDirs as $newDir) {
                    $dirs[] = "$entry/$newDir";
                }
            }
        }
    }

    return $dirs;
}


-1

Tüm PHP dosyalarını özyinelemeli olarak bulun. Mantık ince ayar yapmak için yeterince basit olmalı ve işlev çağrılarından kaçınarak hızlı (er) olmayı amaçlamaktadır.

function get_all_php_files($directory) {
    $directory_stack = array($directory);
    $ignored_filename = array(
        '.git' => true,
        '.svn' => true,
        '.hg' => true,
        'index.php' => true,
    );
    $file_list = array();
    while ($directory_stack) {
        $current_directory = array_shift($directory_stack);
        $files = scandir($current_directory);
        foreach ($files as $filename) {
            //  Skip all files/directories with:
            //      - A starting '.'
            //      - A starting '_'
            //      - Ignore 'index.php' files
            $pathname = $current_directory . DIRECTORY_SEPARATOR . $filename;
            if (isset($filename[0]) && (
                $filename[0] === '.' ||
                $filename[0] === '_' ||
                isset($ignored_filename[$filename])
            )) 
            {
                continue;
            }
            else if (is_dir($pathname) === TRUE) {
                $directory_stack[] = $pathname;
            } else if (pathinfo($pathname, PATHINFO_EXTENSION) === 'php') {
                $file_list[] = $pathname;
            }
        }
    }
    return $file_list;
}

Soru, dosyaların bir listesini veya herhangi bir özyineleme istemedi. Belirli bir dizindeki dizinlerin listesi.
miken32

Ben çok farkındayım. O zaman, bunun Google veya benzeri için en iyi yanıt olduğuna inanıyorum. Orijinal sorunu çözmek için kesilebilecek bir şey sağlamada herhangi bir zarar görmüyorum.
SilbinaryWolf

-1

Özyinelemeli bir dizin listeleme çözümleri arıyorsanız. Aşağıdaki kodu kullanın umarım size yardımcı olacaktır.

<?php
/**
 * Function for recursive directory file list search as an array.
 *
 * @param mixed $dir Main Directory Path.
 *
 * @return array
 */
function listFolderFiles($dir)
{
    $fileInfo     = scandir($dir);
    $allFileLists = [];

    foreach ($fileInfo as $folder) {
        if ($folder !== '.' && $folder !== '..') {
            if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === true) {
                $allFileLists[$folder . '/'] = listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder);
            } else {
                $allFileLists[$folder] = $folder;
            }
        }
    }

    return $allFileLists;
}//end listFolderFiles()


$dir = listFolderFiles('your searching directory path ex:-F:\xampp\htdocs\abc');
echo '<pre>';
print_r($dir);
echo '</pre>'

?>

-1

Aşağıdaki özyinelemeli işlev, alt dizinlerin tam listesini içeren bir dizi döndürür

function getSubDirectories($dir)
{
    $subDir = array();
    $directories = array_filter(glob($dir), 'is_dir');
    $subDir = array_merge($subDir, $directories);
    foreach ($directories as $directory) $subDir = array_merge($subDir, getSubDirectories($directory.'/*'));
    return $subDir;
}

Kaynak: https://www.lucidar.me/en/web-dev/how-to-get-subdirectories-in-php/


Soru özyineleme istemedi. 2010 yılında kendilerine verilen belirli bir dizindeki dizinlerin listesi.
miken32

-2

Belirtilen bir dizinin altındaki tüm dosya ve klasörleri bulun.

function scanDirAndSubdir($dir, &$fullDir = array()){
    $currentDir = scandir($dir);

    foreach ($currentDir as $key => $val) {
        $realpath = realpath($dir . DIRECTORY_SEPARATOR . $val);
        if (!is_dir($realpath) && $filename != "." && $filename != "..") {
            scanDirAndSubdir($realpath, $fullDir);
            $fullDir[] = $realpath;
        }
    }

    return $fullDir;
}

var_dump(scanDirAndSubdir('C:/web2.0/'));

Örneklem :

array (size=4)
  0 => string 'C:/web2.0/config/' (length=17)
  1 => string 'C:/web2.0/js/' (length=13)
  2 => string 'C:/web2.0/mydir/' (length=16)
  3 => string 'C:/web2.0/myfile/' (length=17)

Bu tam bir cevap değildir, çünkü çalıştırılamaz.
miken32

@ miken32 Tam bir cevap, tekrar deneyin
A-312
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.