知道多维数组中的元素级别

时间:2012-09-29 23:40:41

标签: php multidimensional-array levels

好吧,我在这里再次处理php中的数组。我需要你的手指引我朝着正确的方向前进。假设有以下数组:

-fruits
    --green
        ---limon
        ---mango
    --red
        ---apple


-cars
    --ferrari
        ---enzo
            ----blue
            ----black
        ---318
    --lamborg
        ---spider
        ---gallardo
            ----gallado-96
                -----blue
                -----red
            -----gallado-98

- (连字符)符号仅说明深层次。

好吧,我需要构建另一个数组(或其他),因为它应该打印为HTML select,如下所示:

-fruits
--green
---limon
---mango
--red
---apple
-cars
--ferrari
---enzo
----blue
----black
---318
--lamborg
---spider
---gallardo
----gallado-96
-----blue
-----red
-----gallado-98

看起来对于每个级别元素,它应该添加一个空格或连字符来确定它属于特定的父级。

修改

已经提供了答案,提供了我的最终代码。 html select元素将每个级别显示为字符串(在文本的乞讨处重复“ - ”而不是多级元素。

2 个答案:

答案 0 :(得分:0)

这是一个简单的递归函数,用于在给定数组的情况下构建选择下拉列表。不幸的是我无法测试它,但让我知道它是否有效。用法如下:

function generateDropdown($array, $level = 1)
{
    if ($level == 1)
    {
        $menu = '<select>';
    }
    foreach ($array as $a)
    {
        if (is_array($a))
        {
            $menu .= generateDropdown($a, $level+1);
        }
        else
        {
            $menu .= '<option>'.str_pad('',$level,'-').$a.'</option>'."\n";
        }
    }
    if ($level == 1)
    {
        $menu = '</select>';
    }
    return $menu;
}

答案 1 :(得分:0)

好的,我在@ jmgardhn2的帮助下得到了它。

数据

这是我的阵列:

$temp = array(
            array(
                'name' => 'fruits',
                'sons' => array(
                            array(
                                'name' => 'green',
                                'sons' => array(
                                        array(
                                            'name' => 'mango'
                                        ),
                                        array(
                                            'name' => 'banana',
                                        )
                                    )
                                )
                            )
            ),
            array(
                'name' => 'cars',
                'sons' => array(
                            array(
                                'name' => 'italy',
                                'sons' => array(
                                            array(
                                                'name' => 'ferrari',
                                                'sons' => array(
                                                        array(
                                                            'name' => 'red'
                                                        ),
                                                        array(
                                                            'name' => 'black'
                                                        ),
                                                    )
                                            ),
                                            array(
                                                'name' => 'fiat',
                                            )
                                )
                            ),
                            array(
                                'name' => 'germany',
                                'sons' => array(
                                            array(
                                                'name' => 'bmw',
                                            )
                                        )
                            ),
                )
            )    
        );

递归函数

现在,以下函数将提供包含[level] => [name]

等项的数组
function createSelect($tree, $items, $level)
{
    foreach ($tree as $key)
    {
        if (is_array($key))
        {
            $items = createSelect($key, $items, $level + 1);
        }
        else
        {
            $items[] = array('level' => $level, 'text' => $key);
        }
    }

    return $items;
}

调用函数

现在,按以下方式调用该函数:

$items = createSelect($temp, array(), 0);

输出

如果迭代最终的$ items数组,它将如下所示:

1fruits
2green
3mango
3banana
1cars
2italy
3ferrari
4red
4black
3fiat
2germany
3bmw