PHP récupère tous les sous-répertoires d'un répertoire donné

Comment puis-je obtenir tous les sous-répertoires d'un répertoire donné sans les fichiers, . (répertoire courant) ou .. (répertoire parent) et puis utiliser chaque répertoire dans une fonction?

115
demandé sur Habeeb Perwad 2010-03-26 17:55:15

16 réponses

vous pouvez utiliser glob () avec GLOB_ONLYDIR option

ou

$dirs = array_filter(glob('*'), 'is_dir');
print_r( $dirs);
170
répondu ghostdog74 2010-03-26 14:58:34

Voici comment vous pouvez récupérer uniquement les répertoires avec GLOB:

$directories = glob($somePath . '/*' , GLOB_ONLYDIR);
129
répondu Coreus 2016-11-07 20:16:27

la classe SPL DirectoryIterator fournit une interface simple pour visualiser le contenu des répertoires du système de fichiers.

$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
    if ($fileinfo->isDir() && !$fileinfo->isDot()) {
        echo $fileinfo->getFilename().'<br>';
    }
}
32
répondu stloc 2017-09-25 14:36:38

presque le même que dans votre question précédente :

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

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

remplacer strtoupper par la fonction désirée.

23
répondu Gordon 2017-05-23 10:31:11

essayez ce code:

<?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;
5
répondu keyur0517 2015-11-06 07:11:16

Dans Le Tableau:

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

//accès:

$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

exemple pour tous:

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
4
répondu Ricardo Canelas 2017-03-09 11:17:15

mode de transport

/**
 * 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);
    });
}

Inspiré par Laravel

2
répondu Macbric 2016-06-01 22:55:42
<?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
    */
?>
1
répondu Sanaan Barzinji 2015-09-15 09:21:19

vous pouvez essayer cette fonction (PHP 7 requis)

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
répondu Jan-Fokke 2016-09-12 10:11:47

Vous pouvez utiliser la fonction glob() pour ce faire.

voici de la documentation à ce sujet: http://php.net/manual/en/function.glob.php

0
répondu Eclipse 2015-04-16 14:49:42

trouvez tous les fichiers PHP de façon récursive. La logique doit être assez simple pour s'adapter et elle vise à être rapide(er) en évitant les appels de fonction.

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;
}
0
répondu SilbinaryWolf 2016-12-07 09:54:11

si vous êtes à la recherche d'un répertoire récursif solutions. Utilisez le code ci-dessous j'espère que cela vous aidera.

<?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>'

?>
0
répondu Faisal 2017-05-27 18:05:24

pour les personnes qui veulent réellement des dossiers et des sous-dossiers sans fichiers, tout comme L'OP dit, le code suivant produit à la fois une liste de dossiers et de leurs sous-dossiers, et un tableau de la même.

<?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);
echo ' '. $folder. ' ' <br>';
            } else {
                echo' ';
            }
        }
    }

    return $allFileLists;
}//end listFolderFiles()

listFolderFiles('C:\wamp64\www\code');
$dir = listFolderFiles('C:\wamp64\www\code');
echo '<pre>';
print_r($dir);
echo '</pre>'

?>
0
répondu ax.falcon 2018-04-27 09:28:56

j'ai écrit un scanner qui fonctionne très bien et scanne des répertoires et des sous-répertoires dans chaque répertoire et fichiers.

function scanner($path){
    $result = [];
    $scan = glob($path . '/*');
    foreach($scan as $item){
        if(is_dir($item))
            $result[basename($item)] = scanner($item);
        else
            $result[] = basename($item);
    }
    return $result;
}

exemple

var_dump(scanner($path));

retourne:

array(6) {
  ["about"]=>
  array(2) {
    ["factory"]=>
    array(0) {
    }
    ["persons"]=>
    array(0) {
    }
  }
  ["contact"]=>
  array(0) {
  }
  ["home"]=>
  array(1) {
    [0]=>
    string(5) "index.php"
  }
  ["projects"]=>
  array(0) {
  }
  ["researches"]=>
  array(0) {
  }
  [0]=>
  string(5) "index.php"
}
0
répondu Amir Forsati 2018-06-30 18:07:48

La fonction récursive retourne un tableau avec la liste complète des sous-répertoires

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

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

0
répondu Imabot 2018-09-21 04:57:11

Trouver tous les fichiers et dossiers dans un répertoire spécifié.

function getAllSubdir($dir, &$fullDir = []) {
    $currentDir = scandir($dir);

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

    return $fullDir;
}

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

échantillon:

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)
-1
répondu Hors Sujet 2015-11-05 17:09:26