У меня есть следующий массив таблиц / 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... )
)
)
Какие-либо предложения? Спасибо!
Цель этого кода — реализовать решение самым простым способом, это неэффективно.
Этот подход попытается найти все дочерние элементы для каждого элемента в массиве.
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;
}
Я придумал это, оно должно работать так, как вы этого хотите.
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);
}