рекурсия — PHP конвертирует массив строк в ассоциативный массив с древовидной структурой

У меня есть следующий массив таблиц / PHP;

 fileid | storage | parent |    name    | is_dir |        last_changed        |   size    | revision
--------+---------+--------+------------+--------+----------------------------+-----------+----------
1 |       1 |        | bunny.mov  | f      | 2016-05-17 12:20:45.430934 | 514832018 |      103
2 |       1 |        | 10mb.bin   | f      | 2016-05-17 12:24:11.291796 |  10000000 |      104
3 |       1 |        | 10mb.bin   | f      | 2016-05-17 12:28:16.867    |  10000000 |      105
4 |       1 |        | bunny.mov  | f      | 2016-05-17 12:34:42.191069 | 514832018 |      106
5 |       1 |        | miep2      | t      | 2016-05-17 12:38:09.286883 |      4096 |      107
6 |       1 |      5 | bunny.mov  | f      | 2016-05-17 12:38:09.295631 | 514832018 |      107
7 |       1 |        | miep2      | t      | 2016-05-17 12:48:25.375968 |      4096 |      108
8 |       1 |      7 | bunany.mov | f      | 2016-05-17 12:48:25.384048 | 514832018 |      108

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

Пока у меня есть следующий код;

private function rebuildStructure($files, $parent)
{
$result = array();

foreach ($files as $file){
$entries = array();
//get entries with $parent
foreach ($files as $entry_file){
if ($entry_file->parent == $file->id){
array_push($entries, $this->rebuildStructure($files, $entry_file->fileid));
}
}
array_push($result, array(
'name' => $file->name,
'entries' => $entries
));
}
return $result;
}

Но это, однако, не работает (бесконечный цикл). Любые идеи, где я иду не так?
Я хотел бы что-то вроде;

array(
array( 'name' => 'miep2',
'entries' => array( ...and repeat... )
)
)

Какие-либо предложения? Спасибо!

0

Решение

Цель этого кода — реализовать решение самым простым способом, это неэффективно.

Этот подход попытается найти все дочерние элементы для каждого элемента в массиве.

private function rebuildStructure($files, $parent)
{
$result = array();

foreach ($files as $file) {
// I'm searching for some childs, and I'm not one of them.
if (0 != $parent && $parent != $file->parent) continue;

// I'm a child and we are searching just for "parents"if (!empty($file->parent) && 0 == $parent) continue;

$entries = array();

// Next nesting level, search for children
array_push($entries, rebuildStructure($files, $file->fileid));

array_push($result, array(
'name' => $file->name,
'entries' => $entries
));
}

return $result;
}
1

Другие решения

Я придумал это, оно должно работать так, как вы этого хотите.

private function rebuildStructure($files)
{
$result = array();

foreach ($files as $file)
{
$entries = array();

foreach ($files as $entry_file)
{
if ($entry_file->parent === $file->id)
{
$nestedArray = array();
array_push($nestedArray, $entry_file);
array_push($entries, $nestedArray);
}
}
array_push($result, array(
'name' => $file->name,
'entries' => $entries
));
}
return $result;
}

// Call this function to get the tree structure
public function getRebuildedStructure($files)
{
return rebuildStructure($files);
}
0

По вопросам рекламы [email protected]