从关联数组创建n级菜单数组

时间:2017-12-20 11:40:06

标签: php arrays recursion multidimensional-array

我想从我的php数组创建一个n级菜单数组。可以有n级孩子。主阵列将是相同的意味着不是多维n级数组。我提供了一个满足我正在使用的数组结构的示例数组。

$menu_array = 
Array
(
[menu-main] => Array
    (
        [menu_name] => Menu Name 1
        [menu_slug] => menu-main
        [parent_menu_slug] => 
    )
[menu-sub-main] => Array
    (
        [menu_name] => Sub Menu 1
        [menu_slug] => menu-sub-main
        [parent_menu_slug] => menu-main
    )
[menu-sub-sub-main] => Array
    (
        [menu_name] => Sub Sub Menu 1
        [menu_slug] => menu-sub-sub-main
        [parent_menu_slug] => menu-sub-main
    )
[menu-main1] => Array
    (
        [menu_name] => Menu Name 1
        [menu_slug] => menu-main1
        [parent_menu_slug] => 
    )
)

我想创建n级数组以从此数组生成菜单。为此,我尝试了下面的

$x = [];
$tmp = array_combine(array_column($menu_array,'menu_slug'), $menu_array);

//parent menus only
foreach ($tmp as $k => $t) {
    if (empty($t['parent_menu_slug'])) {
        $x[$t['menu_slug']] = $t;
        unset($tmp[$k]);
    }
}

$d = [];
$rec_fn = function ($temp,$parent_slug = '') use (&$rec_fn,$x,&$d) {
    if ($parent_slug && array_key_exists($parent_slug,$x)) {
        $d[$parent_slug]['children'][] = $temp;
    } else {
        foreach ($temp as $c) {
            if (!empty($c['parent_menu_slug'])) {
                $d['children'][] = $rec_fn($c,$c['parent_menu_slug']);
            }
        }
    }
     return $d;
   };

$final_menu = $rec_fn($tmp);

但它没有返回所需的结果。所需的结果是

Array
(
[menu-main] => Array
    (
        [menu_name] => Menu Name 1
        [menu_slug] => menu-main
        [parent_menu_slug] => 
        [children] => array(
            [menu-sub-main] => Array
            (
                [menu_name] => Sub Menu 1
                [menu_slug] => menu-sub-main
                [parent_menu_slug] => menu-main
                [children] => array(
                    [menu-sub-sub-main] => Array
                    (
                        [menu_name] => Sub Sub Menu 1
                        [menu_slug] => menu-sub-sub-main
                        [parent_menu_slug] => menu-sub-main
                    )
                    .
                    .
                )
            )
            .
            .
        )
    )
[menu-main1] => Array
    (
        [menu_name] => Menu Name 1
        [menu_slug] => menu-main1
        [parent_menu_slug] => 
    )
..
)

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

来自link

我已根据要求更改了一些函数参数,并获得了确切的输出,我更改了分支线。

这是实现此目的的递归函数,

function buildTree(array $elements, $options = [
    'parent_id_column_name' => 'parent_menu_slug',
    'children_key_name' => 'children',
    'id_column_name' => 'menu_slug'], $parentId = '')
    {
    $branch = array();
    foreach ($elements as $element) {
        if ($element[$options['parent_id_column_name']] == $parentId) {
            // we will call for every node which is having its child using recursion
            $children = buildTree($elements, $options, $element[$options['id_column_name']]);
            if ($children) { // if it have children array then save it
                $element[$options['children_key_name']] = $children;
            }
            // we will save every node's parent generated recursive data here
            $branch[$element['menu_slug']] = $element; // I changed this line
        }
    }
    // recursive generated data returned
    return $branch;
}

以下是demo

相关问题