使用php创建动态菜单数组

时间:2016-12-08 04:24:31

标签: php

我想创建遵循以下格式的数组,以便在PHP中创建动态菜单。

$array = [
    ['id'=>1, 'childs'=>[]],
    ['id'=>2, 'childs'=>[
        ['id'=>5, 'childs'=>[]],
        ['id'=>6, 'childs'=>[]]
    ]],
    ['id'=>3, 'childs'=>[
        ['id'=>7, 'childs'=>[
            ['id'=>8,'childs'=>[
                ['id'=>10,'childs'=>[]]
            ]]
        ]]
    ]],
    ['id'=>4, 'childs'=>[]],
];

SQL中的数据

id  id_parent

1   0
2   0
3   0
4   0
5   2
6   2
7   3
8   7
9   8

1 个答案:

答案 0 :(得分:1)

虽然你没有努力解决你的问题,但我会回答这个问题,因为如果你不熟悉某些概念,这是一项艰巨的任务。我也理解你的问题并不意味着" dynamic" ,因为它不是硬编码的。

首先,最终产品并不完全是您所展示的,但是如何设置预期的输出有点多余。根据定义,另一个数组下的填充数组将是子项(" childs" ),因此无需将它们存储在名为" childs的子数组中"

要创建此数组,您需要能够创建一个数组,但随后也可以遍历同一个数组。你必须小心不要成为一个孤儿,这意味着你有一个id_parent值,但你的主阵列中没有相应的id。没有额外的脚本,它不会显示在菜单中。

我注意到观众可以理解发生了什么,而不是盲目地复制和粘贴。最后一点,我并没有真正利用PHP的面向对象的递归数组迭代器(或它的其他迭代器类),所以你应该研究它们。您可以更有效地完成同样的事情:

# Main array with parents/children
$array  =   array(
    array(
        'id'=>1,
        'id_parent'=>0
    ),
    array(
        'id'=>2,
        'id_parent'=>0
    ),
    array(
        'id'=>3,
        'id_parent'=>0
    ),
    array(
        'id'=>4,
        'id_parent'=>0
    ),
    array(
        'id'=>5,
        'id_parent'=>2
    ),
    array(
        'id'=>6,
        'id_parent'=>2
    ),
    array(
        'id'=>7,
        'id_parent'=>3
    ),
    array(
        'id'=>8,
        'id_parent'=>7
    ),
    array(
        'id'=>9,
        'id_parent'=>8
    )
);

/*
** @description This function is a recursive iterator, meaning it will
**              traverse the current array and all children
** @param   $curr [string|int]  This is the current id value being ready to place
** @param   $parent [string|int] This is the current parent id being searched
** @param   $arr [array] This is the array that is being built for the menu structure
** @param   $array [array]  This is the array pool of ids and parent ids. We are going to pass by reference
**                          to update this array as we go to fix chicken-before-the-egg scenarios
** @param   $rKey [int] This is the current key being iterated on in the main array pool
*/
function recurse($curr,$parent,$arr,&$array,$rKey)
    {   
        # Loop through our menu array to try and match parents
        foreach($arr as $key => $value) {
            # If there is a match
            if($parent == $key) {
                # Remove the key/value pair from main array
                unset($array[$rKey]);
                # Add the id to our menu array
                $arr[$key][$curr]   =   array();
            }
            # If there is no immediate parent match
            else {
                # If the value is an array, try and now look through it for parent, else just continue
                $arr[$key]  =   (is_array($value))? recurse($curr,$parent,$value,$array,$rKey) : $value;
            }
        }
        # Send back this current array
        return $arr;
    }

/*
**  @description    This function takes your pool of ids and loops through them, sorting the menu items
*/
function getMenuArray($array)
    {
        # This is the final storage array
        $arr    =   array();
        # First count to see how many are available
        $count  =   count($array);
        # Start looping
        for($i=0; $i<$count; $i++) {
            $row    =   $array[$i];
            # If there are no parents, the just assign base menu
            if(empty($row['id_parent'])) {
                $arr[$row['id']]    =   array();
                # Remove this key/value pair from main array since it's been used
                unset($array[$i]);
            }
            else {
                # Recurse what we currently have stored for the menu
                $new    =   recurse($row['id'],$row['id_parent'],$arr,$array,$i);
                # If the recurse function didn't find it's parent
                if(isset($array[$i])) {
                    # add it to the back of the array
                    $array[]    =   $row;
                    # Remove the current array
                    unset($array[$i]);
                    # Recount how many are left to iterate through
                    $count      =   count($array);
                }
                # If the parent was found
                else
                    # Assign the $new array
                    $arr    =   $new;
            }
        }
        # Return the array
        return $arr;
    }

print_r(getMenuArray($array));

给你:

Array
(
    [1] => Array
        (
        )

    [2] => Array
        (
            [5] => Array
                (
                )

            [6] => Array
                (
                )
        )

    [3] => Array
        (
            [7] => Array
                (
                    [8] => Array
                        (
                            [9] => Array
                                (
                                )
                        )
                )
        )

    [4] => Array
        (
        )
)