【问题标题】:Create dynamic menu array using php使用 php 创建动态菜单数组
【发布时间】:2016-12-09 00:18:58
【问题描述】:

我想创建遵循以下格式的数组,以便在 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

【问题讨论】:

  • 那么你尝试了什么?
  • 动态和 PHP? AJAX。

标签: php


【解决方案1】:

虽然您没有付出任何努力来解决您的问题,但我会回答这个问题,因为如果您不熟悉某些概念,这是一项艰巨的任务。我也理解您的问题并不是指“动态”,因为它没有硬编码。

首先,最终产品与您展示的不完全一样,但您如何设置预期的输出有点多余。根据定义,另一个数组下的填充数组将是子数组(“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
        (
        )
)

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2021-09-13
    • 2020-06-17
    • 2016-06-12
    相关资源
    最近更新 更多