PHP преобразовать ассоциативный массив строк в древовидную структуру

0

У меня есть список путей (только строки), например:

$data = array(
    array('path' => 'foo/bar/baz'),
    array('path' => 'foo/bar/baz/qux'),
    array('path' => 'foo/bar'),
    array('path' => 'bar/baz/foo'),
    array('path' => 'baz'),
);

Я хотел бы создать такую структуру

Array
(
    [foo] => Array
        (
            [bar] => Array
                (
                    [baz] => Array
                        (
                            [qux] => null
                        )
                )
        )
    [bar] => Array
        (
            [baz] => Array
                (
                    [foo] => null
                )
        )
    [baz] => null
)

Примечание

  1. структура отображает только, не общие части
  2. лист был бы null (null для меня было бы без детей)

Я знаю, вы спросите меня, что вы пробовали? проблема в том, что я не знаю, как правильно решать проблему

Можете ли вы дать мне несколько советов, без резни нисходящего потока?

  • 1
    Я не вижу шаблон за массивом и ожидаемый результат. Потому что в конце вы создаете: [baz] => но у вас уже есть тот, который начинается с этого.
  • 0
    @ Rizier123 лист будет null ( null для меня было бы без детей)
Показать ещё 2 комментария
Теги:
tree

2 ответа

2
Лучший ответ

Я получил довольно близко, но вместо окончаний, null, они представляют собой массив размером 0.

<?php

function ProcessPath($entry,$depth,&$current)
{
  if($depth<count($entry))
  {
    $key = $entry[$depth];
    if(!isset($current[$key]))$current[$key] = null;
    ProcessPath($entry,$depth+1,$current[$key]);
  }
}


$data = array(
  array('path' => 'foo/bar/baz'),
  array('path' => 'foo/bar/baz/qux'),
  array('path' => 'foo/bar'),
  array('path' => 'bar/baz/foo'),
  array('path' => 'baz'),
);
$result = null;
foreach($data as $path)
{
  ProcessPath(explode("/",$path['path']),0,$result);
}

print_r($result);

?>

вывод

Array
(
    [foo] => Array
        (
            [bar] => Array
                (
                    [baz] => Array
                        (
                            [qux] => 
                        )

                )

        )

    [bar] => Array
        (
            [baz] => Array
                (
                    [foo] => 
                )

        )

    [baz] => 
)

По сути, функция ProcessPath принимает:

  • Массив разделенного пути
  • Текущая глубина, например: [foo] (0) или foo > [bar] (1) или foo > bar > [baz] (2)
  • Ссылка на то, где на массиве помещается путь (обозначается &$reference

Сначала функция проверяет, находится ли глубина в текущем пути обработки.

Затем он извлекает $key чтобы упростить остальную часть кода.

Здесь происходит волшебство, если на выходе нет текущего сегмента сегмента пути, он устанавливает его.

Последняя строка повторяет следующий элемент в записи пути $entry, беря ту же $entry, увеличивая $depth на 1 и изменяя $current в новый раздел $current[$key].

  • 0
    Если это не работает, просто замените [] на array() (может быть языковая ошибка)
  • 0
    большое Вам спасибо. Я отредактировал ответ для поддержки старых версий php
Показать ещё 4 комментария
0

То, что вы можете сделать, это перебрать пути, взорвать строку каждого пути и затем добавить каждое значение в новый массив в зависимости от позиции значения. Если значение первое, тогда это будет база. Если он второй, то он входит в новый массив внутри первого и так далее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню