পিএইচপি একটি প্রদত্ত ডিরেক্টরিতে সমস্ত সাব ডিরেক্টরি ডিরেক্টরি পান


139

ফাইল, .(বর্তমান ডিরেক্টরি) বা ..(মূল ডিরেক্টরি) ছাড়াই প্রদত্ত ডিরেক্টরিগুলির সমস্ত উপ ডিরেক্টরিগুলি কীভাবে পেতে পারি এবং তারপরে একটি ডিরেক্টরিতে প্রতিটি ডিরেক্টরি ব্যবহার করতে পারি?

উত্তর:


210

আপনি বিকল্প সহ গ্লোব () ব্যবহার করতে পারেনGLOB_ONLYDIR

অথবা

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

যে পাশাপাশি উপ-ডিরেক্টরি দেয়?
গর্ডন

2
আপনাকে এখানে একটি পুনর্বিবেচনা করতে হবে
জোসেফ সাবল

দুঃখিত, GLOB_ONLYDIR বিকল্পটি এখানে কোথায় ??
developerbmw

5
শব্দটি নোট করুন বা । তিনি লক্ষ্য অর্জনের দুটি ভিন্ন পদ্ধতি উপস্থাপন করেন।
কেন ওয়েইন ভেন্ডারলিন্ডে

7
একটি দুর্দান্ত, সহজ পদ্ধতির সময়, স্বীকৃত উত্তরটি প্রশ্নের উত্তর দেয় না: পিতামহুল ডিরেক্টরি থেকে উপ-ডিরেক্টরিগুলি পাওয়া (বর্তমান ওয়ার্কিং ডিরেক্টরিটির ওরফে ভাইবোন)। এটি করার জন্য এটি কাজ ডিরেক্টরিটি প্যারেন্ট ডিরেক্টরিতে পরিবর্তন করতে হবে।
রায়ানম

156

আপনি কিভাবে GLOB দিয়ে কেবল ডিরেক্টরিগুলি পুনরুদ্ধার করতে পারেন তা এখানে:

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

2
এর মধ্যে মূল ডিরেক্টরি অন্তর্ভুক্ত রয়েছে।
user4951

3
এটি আমার ক্ষেত্রে (উইন্ডোজ) মূল ডিরেক্টরিটি অন্তর্ভুক্ত করে না
মার্চভটওয়াউট

1
এটি ম্যাক লিনাক্সের জন্য আমার জন্য প্রধান ডিরেক্টরি অন্তর্ভুক্ত করে না। সম্ভবত এটি ব্যবহারের পথের সাথে কি সম্পর্কযুক্ত?
জেক

1
এটি $somePathআউটপুটে পাথও অন্তর্ভুক্ত করে
গডফাদার

47

স্প্লাল ডিরেক্টরীআইট্রেটর শ্রেণি ফাইল সিস্টেম ডিরেক্টরিগুলির বিষয়বস্তু দেখার জন্য একটি সহজ ইন্টারফেস সরবরাহ করে।

$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
সুন্দর ধন্যবাদ! আরও একটি প্রশ্ন: আমি কীভাবে কেবলমাত্র সাব-ডির নামটি পুরো পথ থেকে আলাদা করতে পারি?
অ্যাড্রিয়ান এম।

@ অ্যাড্রিয়ান দয়া করে আপনার অন্যান্য প্রশ্নে আমি যে এপিআই ডকুমেন্টেশন দিয়েছি তা একবার দেখুন। getFilename()কেবল ডিরেক্টরির নামটি ফিরিয়ে দেবে।
গর্ডন

1
বিন্দুগুলি থেকে মুক্তি পাওয়ার জন্য, আমাকে নির্মাণকারীর RecursiveDirectoryIterator::SKIP_DOTSকাছে দ্বিতীয় যুক্তি হিসাবে যুক্ত করতে হয়েছিল RecursiveDirectoryIterator
কোলান

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

আপনি এই ফাংশনটি চেষ্টা করতে পারেন (পিএইচপি 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);
    });
}

লারাভেল দ্বারা অনুপ্রাণিত


1
এটি একটি ওভারকিল বলে মনে হচ্ছে যখন কোনও পতাকা রয়েছে GLOB_ONLYDIR, দেখুন php.net/manual/en/function.glob.php
রবার্ট পাউন্ডার

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

পুনরাবৃত্তভাবে সমস্ত পিএইচপি ফাইলগুলি সন্ধান করুন। যুক্তিটি টুইঙ্ক করার পক্ষে যথেষ্ট সহজ হওয়া উচিত এবং এটি ফাংশন কলগুলি এড়িয়ে দ্রুত (ইআর) হওয়ার লক্ষ্য করে।

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

আমি ভাল সচেতন। এই সময়ে, আমি বিশ্বাস করি এটি গুগল বা অনুরূপ শীর্ষস্থানীয় উত্তর ছিল, সুতরাং আমি পুনরাবৃত্তাকারী বাস্তবায়ন সন্ধানকারীদের জন্য আমার সমাধানটি যুক্ত করেছি যা স্ট্যাকটি বাজায় না। মূল সমস্যাটি সমাধান করার জন্য কেটে ফেলা যায় এমন কিছু সরবরাহ করার কোনও ক্ষতি আমি দেখতে পাচ্ছি না।
সিলবাইনারি ওল্ফ 13'19

-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

@ মিকেন 32 এটি সম্পূর্ণ উত্তর, পুনরায় চেষ্টা করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.