Создать многомерный объект дерева из массива в PHP - PullRequest
1 голос
/ 04 февраля 2020

Мне нужно взять массив, который превращает ключ (разделенный на /) каждого элемента в дочерний массив, и назначает данные в правильном формате в новом массиве. Может быть несколько уровней вложенности, реально никогда не больше 10, но это нужно решить.

Например; учитывая ввод

$i_have_this = [
    "Base/child" => [
      [
        "filename" => "child-1",
        "last_modified" => "29/01/2020"
      ],
      [
        "filename" => "child-2",
        "last_modified" => "29/01/2020"
      ],
      [
        "filename" => "child-3",
        "last_modified" => "29/01/2020"
      ]
    ],
    "Base/child/grandChild1" => [
      [
        "filename" => "grandChild1-1",
        "last_modified" => "29/01/2020"
      ]
    ],
    "Base/child/grandChild2" => [
      [
        "filename" => "grandChild2-1",
        "last_modified" => "29/01/2020"
      ],
      [
        "filename" => "grandChild2-2",
        "last_modified" => "29/01/2020"
      ],
      [
        "filename" => "grandChild2-3",
        "last_modified" => "29/01/2020"
      ],
      [
        "filename" => "grandChild2-4",
        "last_modified" => "29/01/2020"
      ],
      [
        "filename" => "grandChild2-5",
        "last_modified" => "29/01/2020"
      ]
    ]
];

Я бы хотел получить вывод

$want_this = [
    'name' => 'Base',
    'children' => [
        [
            'name' => 'child',
            'children' => [
                ["name" => "child-1"],
                ["name" => "child-2"],
                ["name" => "child-3"],
                [
                    "name" => "grandChild1",
                    "children" => [
                        ["name" => "grandChild1-1"]
                    ]
                ],
                [
                    "name" => "grandChild2",
                    "children" => [
                        ["name" => "grandChild2-1"],
                        ["name" => "grandChild2-2"],
                        ["name" => "grandChild2-3"],
                        ["name" => "grandChild2-4"]
                    ]
                ],
            ]
        ]
    ]
];

Пока у меня есть;

foreach($i_have_this as $path => $value) {
    $temp = &$want_this;

    foreach (explode('/', $path) as $key) {
        $temp = &$temp[$key];
    }
    $temp = $value;

}

, но я не могу вполне финишировать sh выключено.

Пример кода запускается здесь

1 Ответ

0 голосов
/ 04 февраля 2020

Я думаю, вы могли бы относиться к этому так же, как большинство используют «точечные» обозначения для массивов (как в Laravel). Просто замените "." с "/" в вашем случае:

Пример кода

function unflatten($data) {
  $output = [];
  foreach ($data as $key => $value) {
    $parts = explode('/', $key);
    $nested = &$output;
    while (count($parts) > 1) {
      $nested = &$nested[array_shift($parts)];
      if (!is_array($nested)) $nested = [];
    }
    $nested[array_shift($parts)] = $value;
  }
  return $output;
}

print_r(unflatten($i_have_this));
...