Esto podría ser tangencial a su pregunta sobre la matriz, pero podría matar dos pájaros de un tiro utilizando un iterador de directorio recursivo.
$path_to_root = __DIR__;
$directories = new ParentIterator(new RecursiveDirectoryIterator($path_to_root, RecursiveDirectoryIterator::CURRENT_AS_SELF));
$iterator = new RecursiveIteratorIterator($directories, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $item)
{
printf("%d %s\n", $iterator->getDepth() + 1, $item->getSubPathname());
}
que sería algo como de salida:
1 Root
2 Root/A
3 Root/A/A2
3 Root/A/A3
3 Root/A/A4
4 Root/A/A4/A4a
2 Root/B
3 Root/B/B2
3 Root/B/B3
2 Root/C
2 Root/D
2 Root/E
3 Root/E/E2
4 Root/E/E2/E2a
3 Root/E/E3
Como se puede ver RecursiveIteratorIterator::getDepth()
se utiliza para obtener la profundidad actual del iterador recursivo, que es la razón por sugerir este enfoque.
alternativa (si tiene que utilizar una matriz)
Asumiendo que su estructura de matriz se ve algo como:
$dirs = array(
'Root' => array(
'A' => array(
'A2' => array(),
'A3' => array(),
'A4' => array(
'A4a' => array(),
),
),
'B' => array(
'B2' => array(),
'B3' => array(),
),
'C' => array(),
'D' => array(),
'E' => array(
'E2' => array(
'E2a' => array(),
),
'E3' => array(),
),
),
);
A continuación, una muy similar enfoque para obtener los valores de un directorio recursivo iterador (pero esta vez con un iterador de matriz recursivo) puede ser utilizado. Un bucle rápido sobre las matrices "principales" puede darnos la "ruta" desde el elemento actual hasta la raíz.
$recursive = new ParentIterator(new RecursiveArrayiterator($dirs));
$iterator = new RecursiveIteratorIterator($recursive, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $item)
{
// Build path from "parent" array keys
for ($path = "", $i = 0; $i <= $iterator->getDepth(); $i++) {
$path .= "/" . $iterator->getSubIterator($i)->key();
}
// Output depth and "path"
printf("%d %s\n", $iterator->getDepth() + 1, ltrim($path, "/"));
}
La salida sería la misma que la anterior para el iterador del directorio.
TL; DR Podemos usar iteradores recursivos del SPL iterators para hacer que el trabajo con estructuras recursivas/profundas sea mucho más simple.
TL; DR; TL; DR SPL, diablos, sí!
No, no hay forma, ¿por qué no pasa la profundidad actual a su función recursiva? –
¿Se puede publicar la función recursiva? – sjobe
Lo siento, no puedo publicar la función recursiva. Gracias por todos los comentarios y respuestas! –