texto - PHP Obtenga todos los subdirectorios de un directorio determinado
reemplazar archivo php (15)
¿Cómo puedo obtener todos los subdirectorios de un directorio determinado sin archivos,. (directorio actual) o ..
(directorio padre) y luego usa cada directorio en una función?
A continuación, le mostramos cómo puede recuperar solo directorios con GLOB:
$directories = glob($somePath . ''/*'' , GLOB_ONLYDIR);
Casi lo mismo que en tu pregunta anterior :
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($yourStartingPath),
RecursiveIteratorIterator::SELF_FIRST);
foreach($iterator as $file) {
if($file->isDir()) {
echo strtoupper($file->getRealpath()), PHP_EOL;
}
}
Reemplace strtoupper
con su función deseada.
En 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;
}
//acceso:
$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
Ejemplo para mostrar todo:
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
Encuentra todos los archivos PHP recursivamente. La lógica debe ser lo suficientemente simple como para modificarla y pretende ser rápida (er) evitando llamadas a funciones.
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;
}
Encuentra todos los archivos y carpetas bajo un directorio específico.
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/''));
Muestra:
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)
Forma apropiada
/**
* 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);
});
}
Inspirado por Laravel
He escrito un escáner que funciona muy bien y escanea directorios y subdirectorios en cada directorio y archivos.
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;
}
Ejemplo
var_dump(scanner($path));
devoluciones:
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"
}
La clase Spl DirectoryIterator proporciona una interfaz simple para ver los contenidos de los directorios del sistema de archivos.
$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
if ($fileinfo->isDir() && !$fileinfo->isDot()) {
echo $fileinfo->getFilename().''<br>'';
}
}
Para las personas que realmente quieren carpetas y subcarpetas sin archivos, al igual que dijo OP, el siguiente código genera una lista de carpetas y sus subcarpetas, y una matriz de las mismas.
<?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>''
?>
Prueba este código:
<?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;
Puede probar esta función (se requiere 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;
}
Puede usar la función glob () para hacer esto.
Aquí hay un poco de documentación: glob()
Si está buscando una lista recursiva de soluciones de directorio. Use el código siguiente. Espero que lo ayude.
<?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>''
?>
puedes usar glob() con la opción GLOB_ONLYDIR
o
$dirs = array_filter(glob(''*''), ''is_dir'');
print_r( $dirs);
<?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
*/
?>