[英]How to build tree structure from flat array
我有一系列菜單項:
Array
(
[0] => Joomla\CMS\Menu\MenuItem Object
(
[id] => 101
[menutype] => mainmenu
[title] => Home
[alias] => home
[note] =>
[route] => home
[link] => index.php?option=com_content&view=article&id=9
[type] => component
[level] => 1
[language] => *
[browserNav] => 0
[access] => 1
[home] => 1
[img] =>
[template_style_id] => 0
[component_id] => 22
[parent_id] => 1
[component] => com_content
[tree] => Array
(
[0] => 101
)
[query] => Array
(
[option] => com_content
[view] => article
[id] => 9
)
)
[1] => Joomla\CMS\Menu\MenuItem Object
(
[id] => 118
[menutype] => mainmenu
[title] => Legion Bohaterów
[alias] => legion
[note] =>
[route] => legion
[link] => index.php?Itemid=
[type] => alias
[level] => 1
[language] => *
[browserNav] => 0
[access] => 1
[home] => 0
[img] =>
[template_style_id] => 0
[component_id] => 0
[parent_id] => 1
[component] =>
[tree] => Array
(
[0] => 118
)
[query] => Array
(
[Itemid] =>
)
)
[2] => Joomla\CMS\Menu\MenuItem Object
(
[id] => 624
[menutype] => mainmenu
[title] => Dołącz do nas
[alias] => dolacz-do-klubu
[note] =>
[route] => legion/dolacz-do-klubu
[link] => index.php?option=com_content&view=category&layout=blog&id=10
[type] => component
[level] => 2
[language] => *
[browserNav] => 0
[access] => 1
[home] => 0
[img] =>
[template_style_id] => 0
[component_id] => 22
[parent_id] => 118
[component] => com_content
[tree] => Array
(
[0] => 118
[1] => 624
)
[query] => Array
(
[option] => com_content
[view] => category
[layout] => blog
[id] => 10
)
)
[3] => Joomla\CMS\Menu\MenuItem Object
(
[id] => 599
[menutype] => mainmenu
[title] => Wybierz upominki
[alias] => wybierz-upominki
[note] =>
[route] => legion/dolacz-do-klubu/wybierz-upominki
[link] => index.php?option=com_leg&view=upominki
[type] => component
[level] => 3
[language] => *
[browserNav] => 0
[access] => 1
[home] => 0
[img] =>
[template_style_id] => 0
[component_id] => 10069
[parent_id] => 624
[component] => com_leg
[tree] => Array
(
[0] => 118
[1] => 624
[2] => 599
)
[query] => Array
(
[option] => com_leg
[view] => upominki
)
)
在樹元素中,我們有元素的父母(應該附加元素)。 我做了 foreach function 看起來像這樣:
$mtree = array(); //new stdClass();
foreach ($menuitems AS $i => $m)
{
if (sizeof($m->tree)==1) $mtree[$m->tree[0]]=(array)$m;
elseif (sizeof($m->tree)==2) $mtree[$m->tree[0]]["c"][$m->tree[1]] = (array)$m;
elseif (sizeof($m->tree)==3) $mtree[$m->tree[0]]["c"][$m->tree[1]]["c"][$m->tree[2]] = (array)$m;
elseif (sizeof($m->tree)==4) $mtree[$m->tree[0]]["c"][$m->tree[1]]["c"][$m->tree[2]]["c"][$m->tree[3]] = (array)$m;
elseif (sizeof($m->tree)==5) $mtree[$m->tree[0]]["c"][$m->tree[1]]["c"][$m->tree[2]]["c"][$m->tree[3]]["c"][$m->tree[4]] = (array)$m;
}
但這僅適用於特定數量的子樹,而且並不漂亮。 任何想法如何遞歸地做到這一點? (如何將孩子附加到父母數組中指定的分支)。
以下函數可用於打印顯示所有樹項及其自身(父項)的樹。
function getWithIdsAsKeys($menuItems) {
$valuesByKey = [];
foreach ($menuItems as $menuItem) {
$valuesByKey[$menuItem->id] = $menuItem;
}
return $valuesByKey;
};
function printTree($allMenuItems, $menuItems, $depth = 0)
{
foreach ($menuItems as $menuItem) {
$prefix = str_repeat(' ', max(0, $depth - 1));
$nestedSymbol = $depth === 0 ? '' : '└─';
echo $prefix . $nestedSymbol . $menuItem->id . '<br />';
$subTree = array_map(function ($id) use ($allMenuItems, $menuItems) {
return $allMenuItems[$id];
}, array_filter($menuItem->tree, function ($id) use ($menuItem) {
return $id !== $menuItem->id;
}));
printTree($allMenuItems, $subTree, $depth + 1);
}
}
printTree(getWithIdsAsKeys($menuItems), getWithIdsAsKeys($menuItems));
結果:
22
23
└─22
43
└─23
└─22
44
└─43
└─23
└─22
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.