【问题标题】:Create n-level menu array from associative array从关联数组创建 n 级菜单数组
【发布时间】:2018-06-02 23:09:54
【问题描述】:

我想从我的 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] => 
    )
..
)

任何帮助将不胜感激

【问题讨论】:

    标签: php arrays recursion multidimensional-array


    【解决方案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

    【讨论】:

    • 谢谢,一切正常。如果可能的话,你能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2018-10-04
    • 2020-12-04
    • 2014-08-17
    相关资源
    最近更新 更多