@Xawer

Php построение дерева. Как сделать?

Добого дня!

Вопрос следующий:
Имеются строки с адресами:
/dir1/sdir1/file
/dir1/sdir2/sdir3/file
/dir2/sdir1/file

Нужно на выходе получить массив вида:
$out = [
    'dir1' => [
              'sdir1' => ['file'],
              'sdir2' => ['sdir3' => ['file']],
              ],
    'dir2' => [
              'sdir1' =>['file']
              ]
]


Не могу придумать, как это осуществить.
Заранее благодарю за ответы.
  • Вопрос задан
  • 1177 просмотров
Решения вопроса 1
Immortal_pony
@Immortal_pony Куратор тега PHP
// Функция для превращения путей в древовидный массив
function pathsToTree(array $paths, $separator="/") {
    $pathsTree = [];
    
    foreach ($paths as $path) {
        $pathParts = array_reverse(explode($separator, $path));
        $pathTree = [];
        
        foreach ($pathParts as $i=>$pathPart) {
            if (empty($pathPart)) {
                continue;
            }

            $pathTree = ($i == 0 ? [$pathPart] : [$pathPart => $pathTree]);
        }
        
        $pathsTree = array_merge_recursive($pathsTree, $pathTree);
    }
    
    return $pathsTree;
}



// Пример использования
$testPaths = [
    '/dir1/sdir1/file',
    '/dir1/sdir2/sdir3/file',
    '/dir2/sdir1/file'
];

var_dump(pathsToTree($testPaths));
/* Результат:
array(2) {
  ["dir1"]=>
  array(2) {
    ["sdir1"]=>
    array(1) {
      [0]=>
      string(4) "file"
    }
    ["sdir2"]=>
    array(1) {
      ["sdir3"]=>
      array(1) {
        [0]=>
        string(4) "file"
      }
    }
  }
  ["dir2"]=>
  array(1) {
    ["sdir1"]=>
    array(1) {
      [0]=>
      string(4) "file"
    }
  }
}
*/
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
копать в сторону рекурсивных функций. Я мог бы потратить некоторое время на поиск и переделку туевой хучи готовых решений из инета, но думаю вам это доставит большее удовольствие, а так же будет хорошим практическим опытом.
Ответ написан
Комментировать
@strelov1
делай explode по "/" затем собирай массив проверя условия совпадения элементов и вложенности
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы