繁体   English   中英

在递归映射树结构数组时如何跟踪级别?

[英]How can I keep track of level when recursively mapping tree-structure array?

为了构建breadcrumb菜单,我需要将数组$exampleBreadcrumbMenu转换为$exampleFlatArray的形式。

基本上我需要遍历每个路径后面的$exampleBreadcrumbMenu ,为每个菜单项构建一个数组项,并为$exampleFlatArray为我找到的每个菜单项创建信息。

我的递归工作得很好,所以我可以处理树结构中的每个项目,但无法弄清楚如何为每个项目维护正确的级别编号。

主要代码位于$page->remap_breadcrumbmenu_to_flat_array()下面的main函数中。

   $exampleBreadcrumbMenu = ['Home' =>
        [
            'Projects' => [
                'Create Project',
                'View Project',
                'Delete Project',
                'Export Project',
                ['Advanced' => [
                        'Upgrade',
                        'Downgrade'
                    ]
                ]
            ],
            'Employees' => [
                'Create Employee',
                'View Employee',
                'Delete Employee',
                'Export Employee',
                ['Advanced' => [
                        'Upgrade',
                        'Downgrade'
                    ]
                ]
            ],
            'Settings' => [
                ['Front End' => [
                        'CSS',
                        'HTML',
                        'Colors'
                    ]
                ],
                ['Back End' => [
                        'Database',
                        'PHP',
                        'Colors'
                    ]
                ]
            ],
            'About',
            'Help'
        ]
    ];

    $exampleFlatArray = [
        ['home' => [
                'level' => 0,
                'title' => 'Home',
                'prelinks' => [],
                'sublinks' => [
                    ['projects' => 'Projects'],
                    ['employees' => 'Employees'],
                    ['settings' => 'Settings']
                ]
            ]
        ],
        ['projects' => [
                'level' => 1,
                'title' => 'Projects',
                'prelinks' => [
                    ['home' => 'Home']
                ],
                'sublinks' => [
                    ['createProject' => 'Create Project'],
                    ['viewProject' => 'View Project'],
                    ['deleteProject' => 'Delete Project'],
                    ['exportProject' => 'Export Project'],
                    ['advanced' => 'Advanced']
                ]
            ]
        ],
        etc.,
        etc.,
    ];

这是我到目前为止所拥有的:

public function remap_breadcrumbmenu_to_flat_array($breadcrumbMenu, $key = '', $level = 0) {
    $flatArray = [];
    if (is_array($breadcrumbMenu)) {
        $key = $key == '' ? 'Home' : $key;
        echo 'MENU>>>>>>>>>>>>>>>>> ' . $key . ' (' . $level . ')<br/>';
        if (count($breadcrumbMenu) > 0) {
            foreach ($breadcrumbMenu as $key => $breadcrumbItem) {
                $this->remap_breadcrumbmenu_to_flat_array($breadcrumbItem, $key, ++$level);
            }
        }
    } else {
        if(is_string($breadcrumbMenu)) {
            echo $breadcrumbMenu . ' (' . $level . ')<br/>';
        }
    }
}

递归似乎工作正常,但水平不正确:

 MENU>>>>>>>>>>>>>>>>> Home (0) MENU>>>>>>>>>>>>>>>>> Projects (1) Create Project (2) View Project (3) Delete Project (4) Export Project (5) MENU>>>>>>>>>>>>>>>>> Advanced (6) Upgrade (7) Downgrade (8) MENU>>>>>>>>>>>>>>>>> Employees (2) Create Employee (3) View Employee (4) Delete Employee (5) Export Employee (6) MENU>>>>>>>>>>>>>>>>> Advanced (7) Upgrade (8) Downgrade (9) MENU>>>>>>>>>>>>>>>>> Settings (3) MENU>>>>>>>>>>>>>>>>> Front End (4) CSS (5) HTML (6) Colors (7) MENU>>>>>>>>>>>>>>>>> Back End (5) Database (6) PHP (7) Colors (8) About (4) Help (5) 

不要使用++$level ,因为它还会增加当前级别范围内的局部变量,这意味着你将在同一范围内的foreach循环的每次迭代中增加$level $level + 1传递给递归调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM