Итак, название может сбивать с толку, но я не уверен, как обозначить этот вид структуры массива.Конечно, это древовидная структура, но что касается ее создания, то я очень хочу.Похоже, что он не соответствует прототипному построению дерева рекурсивного массива.
Я пытаюсь создать макет каталога столбцов из плоского массива путей, каждый путь находится внутри своего собственного многомерного массива.
Этот массив предназначен для создания интерфейса стиля представления колонок macOS Finder с использованием FinderJS , как показано ниже (из данных ниже):
| elections > | id | | |
| | name | | |
| | description > | field | |
| | dynamic_parent_id > | field | |
| | method > | field > | field_more |
Для библиотеки требуется массив 'item'объекты в JS, в следующем примере формата:
[{
label: 'elections',
children: [{
label: 'id'
}, {
label: 'name'
}, {
label: 'description',
children: [{
label: 'field'
}]
}, {
label: 'dynamic_parent_id',
children: [{
label: 'field'
}]
}, {
label: 'method',
children: [{
label: 'field',
children: [{
label: 'field_more'
}]
}]
}]
}]
Я пытаюсь получить вышеупомянутое из следующего массива PHP, этот массив с именем $fields
:
Array
(
[0] => Array
(
[0] => elections
[1] => id
)
[1] => Array
(
[0] => elections
[1] => name
)
[2] => Array
(
[0] => elections
[1] => description
[2] => field
)
[3] => Array
(
[0] => elections
[1] => dynamic_parent_id
[2] => field
)
[4] => Array
(
[0] => elections
[1] => method
[2] => field
[3] => field_more
)
...[and so forth]...
];
которая должна быть преобразована в следующую структуру, позволяющую выполнять код json_encode и передавать его клиенту для загрузки:
Array
(
[0] => Array
(
[label] => elections
[children] => Array
(
[0] => Array
(
[label] => id
[children] => Array
(
)
)
[1] => Array
(
[label] => name
[children] => Array
(
)
)
[2] => Array
(
[label] => description
[children] => Array
(
[0] => Array
(
[label] => field
[children] => Array
(
)
)
)
)
[3] => Array
(
[label] => dynamic_parent_id
[children] => Array
(
[0] => Array
(
[label] => field
[children] => Array
(
)
)
)
)
[4] => Array
(
[label] => method
[children] => Array
(
[0] => Array
(
[label] => field
[children] => Array
(
[0] => Array
(
[label] => field_more
[children] => Array
(
)
)
)
)
)
)
)
)
)
... and so forth ...
];
Я попытался создать массивы поиска для вычисления и сохранения родительских ключей для поиска во время поискаеще один цикл сборки по требуемому уровню структуры, но он тоже не работает.
Я попытался повторно разложить циклы, чтобы построить дерево на основе уровня изначально, bно он понял, что это должно быть рекурсивно, чтобы сначала создать дочерние массивы, или перейти по уровню, чтобы увидеть, существует ли элемент до генерации на указанном уровне.
На первый взгляд это кажется довольно простым, поскольку высоздание массива на каждом уровне, но проверка, существует ли еще «каталог» на этом уровне, если он существует, введите его, а затем проверьте, существует ли элемент следующего уровня на этом уровне, создайте, если он не существует, и затем войдите в этот массив,Я полагаю, что выполняя последнюю часть рекурсивно, я иду по цепочке столько раз, сколько требуется для каждого пути.
Но на этом этапе все пути, которые я пробовал, исчерпаны, и я немного застрялна этот тизер мозга.Любая помощь будет принята с благодарностью!
Лучшее, что у меня есть, это маленький конструктор деревьев, который я сделал, но только для каждой ветви.Мне нужен еще один цикл, который я предполагаю взять все ключи на уровне 1 и объединить их вместе, то же самое с 2, 3 и т. Д. *
function buildTree(array $branches): array
{
if (count($branches)) {
$branches = array_values($branches);
$newBranch = $branches[0];
unset($branches[0]);
return [
'label' => $newBranch,
'children' => $this->buildTree($branches)
];
} else {
return [];
}
}
foreach ($fields as $field) {
$treePieces[] = $this->buildTree($field);
}
print_r($treePieces);
дает следующий вывод:
Array
(
[0] => Array
(
[label] => elections
[children] => Array
(
[label] => id
[children] => Array
(
)
)
)
[1] => Array
(
[label] => elections
[children] => Array
(
[label] => name
[children] => Array
(
)
)
)
[2] => Array
(
[label] => elections
[children] => Array
(
[label] => description
[children] => Array
(
)
)
)
... and so forth ...
)
Который так близок, но не совсем понятен по понятным причинам, он не попадает в каталог, если родительский объект уже существует.Это следует за типичным строительством дерева?Я чувствую, что это так, но я не могу этого увидеть ...