una - Arreglo recursivo profundo de la estructura de directorios en PHP
recorrer archivos de una carpeta php (4)
Estoy tratando de poner algunas carpetas en mi disco duro en una matriz.
Por ejemplo, fotos de vacaciones. Digamos que tenemos esta estructura:
- Serie 1
- Elemento 1 del conjunto 1
- Elemento 2 del conjunto 1
- Artículo ... del set 1
- Conjunto 2
- Subconjunto 1 del conjunto 2
- Elemento 1 del subconjunto 1 del conjunto 2
- Artículo ... del subconjunto 1 del conjunto 2
- Subconjunto 2 del conjunto 2
- Archivo aleatorio, no un directorio.
- Subconjunto 1 del conjunto 2
- Conjunto 3
- ...
Quiero tener algo así, como una matriz.
Lo que significa que tengo 1 gran matriz y en esa matriz hay más matrices. Cada conjunto y subconjunto obtiene su propia matriz.
Estoy tratando de hacer que se vea algo como esto:
Array
(
[Set 1] => Array([0] => Item 1 of Set 1, [1] => Item 1 of Set 1,...)
[Set 2] => Array([Subnet 1] => Array([0] => Item 1 of Subset 1 of Set 2,[1] => ...), [Subnet 2] => Array([0] => ..., ..., ...), ..., [0] => Random File)
[set 3] => Array(...)
...
)
Encontré esto: http://www.the-art-of-web.com/php/dirlist/
Pero eso no es lo que estoy buscando. He estado entrometiéndome, pero solo me está dando problemas.
Aquí hay un ejemplo, ver la fuente para una resolución mayor (aparentemente sin hacer clic ...).
Basado en el código de respuesta de @ soulmerge . Acabo de eliminar algunas liendres y los comentarios y uso $startpath
como mi directorio de inicio. (GRACIAS @soulmerge!)
function dirToArray($dir) {
$contents = array();
foreach (scandir($dir) as $node) {
if ($node == ''.'' || $node == ''..'') continue;
if (is_dir($dir . ''/'' . $node)) {
$contents[$node] = dirToArray($dir . ''/'' . $node);
} else {
$contents[] = $node;
}
}
return $contents;
}
$r = dirToArray($startpath);
print_r($r);
He tenido éxito con el paquete PEAR File_Find, específicamente con el método mapTreeMultiple () . Tu código se convertiría en algo como:
require_once ''File/Find.php'';
$fileList = File_Find::mapTreeMultiple($dirPath);
Esto debería devolver una matriz similar a la que está solicitando.
Recomiendo usar DirectoryIterator para construir su matriz
Aquí hay un fragmento que junté muy rápido, pero no tengo un entorno para probarlo actualmente, así que prepárate para depurarlo.
$fileData = fillArrayWithFileNodes( new DirectoryIterator( ''/path/to/root/'' ) );
function fillArrayWithFileNodes( DirectoryIterator $dir )
{
$data = array();
foreach ( $dir as $node )
{
if ( $node->isDir() && !$node->isDot() )
{
$data[$node->getFilename()] = fillArrayWithFileNodes( new DirectoryIterator( $node->getPathname() ) );
}
else if ( $node->isFile() )
{
$data[] = $node->getFilename();
}
}
return $data;
}
Una implementación simple sin ningún tipo de manejo de errores:
function dirToArray($dir) {
$contents = array();
# Foreach node in $dir
foreach (scandir($dir) as $node) {
# Skip link to current and parent folder
if ($node == ''.'') continue;
if ($node == ''..'') continue;
# Check if it''s a node or a folder
if (is_dir($dir . DIRECTORY_SEPARATOR . $node)) {
# Add directory recursively, be sure to pass a valid path
# to the function, not just the folder''s name
$contents[$node] = dirToArray($dir . DIRECTORY_SEPARATOR . $node);
} else {
# Add node, the keys will be updated automatically
$contents[] = $node;
}
}
# done
return $contents;
}