PHP 주어진 디렉토리의 모든 서브 디렉토리를 가져옵니다


139

파일이없는 주어진 디렉토리 .(현재 디렉토리) 또는 ..(부모 디렉토리)의 모든 하위 디렉토리를 얻은 다음 함수에서 각 디렉토리를 사용하려면 어떻게해야합니까?

답변:


210

옵션으로 glob () 를 사용할 수 있습니다GLOB_ONLYDIR

또는

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

하위 디렉토리도 제공합니까?
Gordon

2
당신은 여기에서 부활을해야합니다
Josef Sábl

죄송합니다. GLOB_ONLYDIR 옵션은 어디에 있습니까?
developerbmw

5
@developerbmw 또는 단어를 참고하십시오 . 그는 목표를 달성하는 두 가지 다른 방법을 제시합니다.
Ken Wayne VanderLinde

7
훌륭하고 간단한 접근 방법이지만 허용 된 답변은 질문에 대답하지 않습니다. 부모 디렉토리에서 하위 디렉토리 가져 오기 (현재 작업 디렉토리의 형제). 그렇게하려면 작업 디렉토리를 상위 디렉토리로 변경해야합니다.
ryanm

156

GLOB가있는 디렉토리 만 검색하는 방법은 다음과 같습니다.

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

2
여기에는 기본 디렉토리도 포함됩니다.
user4951

3
여기에는 필자의 경우 기본 디렉토리가 포함되어 있지 않습니다 (Windows)
marcovtwout

1
여기에는 Mac Linux의 기본 디렉토리가 포함되어 있지 않습니다. 어쩌면 그것은 사용 된 경로와 관련이 있습니까?
Jake

1
여기에는 $somePath출력 의 경로도 포함됩니다
대부

47

Spl DirectoryIterator 클래스는 파일 시스템 디렉토리의 내용을 볼 수있는 간단한 인터페이스를 제공합니다.

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

27

이전 질문 과 거의 동일합니다 .

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

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

strtoupper원하는 기능으로 교체하십시오 .


1
좋은 감사합니다! 하나 더 질문 : 하위 경로 이름 만 전체 경로와 어떻게 분리 할 수 ​​있습니까?
Adrian M.

@Adrian 다른 질문에서 제공 한 API 설명서를 살펴보십시오. getFilename()디렉토리 이름 만 반환합니다.
Gordon

1
점을 없애려면 생성자에 RecursiveDirectoryIterator::SKIP_DOTS두 번째 인수로 추가해야했습니다 RecursiveDirectoryIterator.
colan December

5

이 코드를 사용해보십시오 :

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

배열에서 :

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

//접속하다:

$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

모두 표시하는 예 :

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

이 기능을 사용해 볼 수 있습니다 (PHP 7 필요)

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

적절한 방법

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

Laravel에서 영감을 받음


1
이것은 플래그가있을 때 과도한 것으로 보인다 GLOB_ONLYDIR, php.net/manual/en/function.glob.php
Robert Pounder

0

이것은 하나의 라이너 코드입니다.

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

0

재귀없이 디렉토리 만 나열

직접 질문 한 유일한 질문 은 잘못 종료되었으므로 여기에 넣어야합니다.

또한 디렉토리를 필터링하는 기능도 제공합니다.

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

모든 PHP 파일을 재귀 적으로 찾으십시오. 로직은 조정하기에 충분히 간단해야하며 함수 호출을 피함으로써 더 빠른 속도를 목표로합니다.

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

이 질문은 파일 목록이나 재귀를 요구하지 않았습니다. 주어진 디렉토리의 디렉토리 목록.
miken32

잘 알고 있습니다. 당시에는 이것이 Google이나 그와 비슷한 질문에 대한 답이라고 생각하므로 스택을 날리지 않는 재귀 구현을 찾는 사람들을 위해 솔루션을 추가했습니다. 원래 문제를 해결하기 위해 줄일 수있는 것을 제공하는 데 아무런 해가 없습니다.
SilbinaryWolf

-1

재귀 디렉토리 목록 솔루션을 찾고 있다면. 아래 코드를 사용하면 도움이되기를 바랍니다.

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

다음 재귀 함수는 전체 하위 디렉토리 목록이있는 배열을 반환합니다.

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

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


질문은 재귀를 요구하지 않았다. 주어진 디렉토리에있는 디렉토리의 목록, 2010 년에 제공된 디렉토리.
miken32

-2

지정된 디렉토리에서 모든 파일과 폴더를 찾으십시오.

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/'));

샘플 :

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)

실행할 수 없으므로 완전한 답변이 아닙니다.
miken32

@ miken32 그것은 완전한 답변입니다, 다시 시도하십시오
A-312
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.