簡體   English   中英

如何從平面數組構建樹結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM