Wie kann ich alle Unterverzeichnisse eines bestimmten Verzeichnisses ohne Dateien, .
(aktuelles Verzeichnis) oder ..
(übergeordnetes Verzeichnis).
sie können die Option glob () mit der Option GLOB_ONLYDIR
verwenden
oder
$dirs = array_filter(glob('*'), 'is_dir');
print_r( $dirs);
So können Sie nur Verzeichnisse mit GLOB abrufen:
$directories = glob($somePath . '/*' , GLOB_ONLYDIR);
Die Klasse Spl DirectoryIterator bietet eine einfache Schnittstelle zum Anzeigen des Inhalts von Dateisystemverzeichnissen.
$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
if ($fileinfo->isDir() && !$fileinfo->isDot()) {
echo $fileinfo->getFilename().'<br>';
}
}
Fast das gleiche wie in Ihrer vorherigen Frage :
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($yourStartingPath),
RecursiveIteratorIterator::SELF_FIRST);
foreach($iterator as $file) {
if($file->isDir()) {
echo strtoupper($file->getRealpath()), PHP_EOL;
}
}
Ersetzen Sie strtoupper
durch Ihre gewünschte Funktion.
Versuchen Sie diesen 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;
In Array:
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;
}
//Zugriff:
$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
Beispiel, um alle anzuzeigen:
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
Richtige Weg
/**
* 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);
});
}
Inspiriert von Laravel
Sie können diese Funktion ausprobieren (PHP 7 erforderlich)
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;
}
<?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
*/
?>
Dies ist der One-Liner-Code:
$sub_directories = array_map('basename', glob($directory_path . '/*', GLOB_ONLYDIR));
Sie können dazu die Funktion glob () verwenden.
Hier einige Dokumentationen dazu: http://php.net/manual/de/function.glob.php
Alle PHP -Dateien rekursiv suchen. Die Logik sollte für Tweak einfach genug sein und zielt darauf ab, schnell zu sein, indem Funktionsaufrufe vermieden werden.
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;
}
Für die Personen, die tatsächlich Ordner und Unterordner ohne Dateien haben möchten, gibt der folgende Code, genau wie das OP gesagt, sowohl eine Liste von Ordnern und deren Unterordner als auch ein Array derselben aus.
<?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>'
?>
Ich habe einen Scanner geschrieben, der sehr gut funktioniert und Verzeichnisse und Unterverzeichnisse in jedem Verzeichnis und in allen Dateien durchsucht.
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;
}
Beispiel
var_dump(scanner($path));
kehrt zurück:
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"
}
Die folgende rekursive Funktion gibt ein Array mit der vollständigen Liste der Unterverzeichnisse zurück
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;
}
Quelle: https://www.lucidar.me/de/web-dev/how-to-get-subdirectories-in-php/
Wenn Sie nach einem rekursiven Verzeichnis suchen, das Lösungen auflistet. Verwenden Sie den folgenden Code. Ich hoffe, er sollte Ihnen helfen.
<?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>'
?>