2013-01-13 9 views
10

संभव डुप्लिकेट:
PHP Get all subdirectories of a given directoryपीएचपी - सभी निर्देशिका और उप-निर्देशिका लिस्टिंग रिकर्सिवली ड्रॉप डाउन मेनू

मैं ./files/$userid/ में सभी उप-निर्देशिका को दिखाने के लिए नहीं एक ड्रॉप डाउन मेनू चाहते हैं बस मुख्य फ़ोल्डर। उदाहरण के लिए: /files/$userid/folder1/folder2/

मेरे वर्तमान कोड है:

HTML:

<select name="myDirs"> 
<option value="" selected="selected">Select a folder</option> 

पीएचपी:

if (chdir("./files/" . $userid)) { 

     $dirs = glob('*', GLOB_ONLYDIR); 
     foreach($dirs as $val){ 
      echo '<option value="'.$val.'">'.$val."</option>\n"; 
     }   
     } else { 
     echo 'Changing directory failed.'; 
} 
+0

और अपने प्रश्न है? ध्यान रखें कि फॉर्मूलेटिंग आवश्यकता प्रोग्रामिंग प्रश्न नहीं है। मेरा सुझाव है कि आप साइट पर अपनी आवश्यकताओं की खोज करें, क्योंकि लिस्टिंग निर्देशिकाओं से पहले से ही विभिन्न स्वादों में पूछा गया है और उत्तर दिया गया है। [तो बार में जगह क्यों न लें और अपना पेय न दें?] (Http://stackoverflow.com/search) – hakre

+0

आपको PHP के मूल [रिकर्सिव डायरेक्टरी इटरेटर] (http://php.net/manual/en का उपयोग करना होगा) /class.recursivedirectoryiterator.php) कक्षा। [यह जवाब] (http://stackoverflow.com/a/2398163/427992) मदद करनी चाहिए। – hohner

+0

मैंने इस http://pastebin.com/fpJiiCbZ को आजमाया, लेकिन यह काम नहीं करता है। यह मुझे प्राप्त आउटपुट है: http://i.imgur.com/gWt3U.png – Brian

उत्तर

48

RecursiveDirectoryIterator चाल करना चाहिए। दुर्भाग्य से, प्रलेखन यहाँ महान नहीं है, तो एक उदाहरण है:

$root = '/etc'; 

$iter = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS), 
    RecursiveIteratorIterator::SELF_FIRST, 
    RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied" 
); 

$paths = array($root); 
foreach ($iter as $path => $dir) { 
    if ($dir->isDir()) { 
     $paths[] = $path; 
    } 
} 

print_r($paths); 

यह मेरा कंप्यूटर पर निम्न उत्पादन उत्पन्न करता है:

Array 
(
    [0] => /etc 
    [1] => /etc/rc2.d 
    [2] => /etc/luarocks 
    ... 
    [17] => /etc/php5 
    [18] => /etc/php5/apache2 
    [19] => /etc/php5/apache2/conf.d 
    [20] => /etc/php5/mods-available 
    [21] => /etc/php5/conf.d 
    [22] => /etc/php5/cli 
    [23] => /etc/php5/cli/conf.d 
    [24] => /etc/rc4.d 
    [25] => /etc/minicom 
    [26] => /etc/ufw 
    [27] => /etc/ufw/applications.d 
    ... 
    [391] => /etc/firefox 
    [392] => /etc/firefox/pref 
    [393] => /etc/cron.d 
) 
+0

धन्यवाद @ कृपया अपना काम ठीक करें, केवल अपने दृश्य –

+0

जैसे सूची दृश्य के लिए एक और फ़ोरैच लूप की आवश्यकता है। यह बेहतर होगा अगर आप छिपे हुए फ़ोल्डरों और उनकी सामग्री को दूर करने के तरीके को चित्रित कर सकते हैं (जैसे '.svn')। – Raptor

+0

मेरे लिए काम नहीं करता है ... टाइमआउट पर भी टाइमआउट्स एक घंटे तक सेट होता है जब निर्देशिका गणना केवल 1000 है –

3

आप इस समारोह में की तरह एक पुनरावर्ती ग्लोब कार्यान्वयन का उपयोग कर सकते हैं:

function rglob($pattern='*', $path='', $flags = 0) { 
$paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT); 
$files=glob($path.$pattern, $flags); 
foreach ($paths as $path) { 
    $files=array_merge($files,rglob($pattern, $path, $flags)); 
} 
return $files; 
} 
+0

@ user183391 जो फाइलों या फ़ोल्डरों को सूचीबद्ध करता है? – Brian

+0

आप $ झंडे तर्क – Alex

10

आप की तरह निर्देशिका की अपनी खुद की पुनरावर्ती सूची लिख सकते हैं:

function expandDirectories($base_dir) { 
     $directories = array(); 
     foreach(scandir($base_dir) as $file) { 
      if($file == '.' || $file == '..') continue; 
      $dir = $base_dir.DIRECTORY_SEPARATOR.$file; 
      if(is_dir($dir)) { 
       $directories []= $dir; 
       $directories = array_merge($directories, expandDirectories($dir)); 
      } 
     } 
     return $directories; 
} 

$directories = expandDirectories(dirname(__FILE__)); 
print_r($directories); 
+2

के लिए GLOB_ONLYDIR उपयोग कर सकते हैं इस बाहरी पुस्तकालयों – Katushai

+0

उपयोग करते हुए इस एक के साथ स्वीकार किए जाते हैं जवाब की तुलना के बिना एक महान php समाधान है, टर्मिनल: 'समय php -f test.php', यह एक तेजी से होता है। –

संबंधित मुद्दे