Это может быть касательно вашего вопроса о массиве, но вы можете убить двух зайцев одним выстрелом, используя рекурсивный итератор каталогов.
$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());
}
Что бы вывести что-то вроде:
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
Как видите, RecursiveIteratorIterator::getDepth()
используется для получения текущей глубины рекурсивного итератора, что является причиной для предложения такого подхода.
Альтернатива (если вы должны использовать массив)
Предположим, что ваша структура массива выглядит примерно так:
$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(),
),
),
);
Тогда можно использовать очень похожий подход к получению значений от рекурсивного итератора каталога (но на этот раз с рекурсивным итератором массива). Быстрый цикл по «родительским» массивам может дать нам «путь» от текущего элемента до корня.
$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, "/"));
}
Вывод будет таким же, как и предыдущий для итератора каталога.
TL; DR Мы можем использовать рекурсивные итераторы из SPL-итераторов , чтобы упростить работу с рекурсивными / глубокими структурами.
TL; DR; TL; DR SPL, черт возьми, да!