试问一个2级多维数组改成n级? [英] How can a 2 level multidimensional array be changed to n levels?

查看:92
本文介绍了试问一个2级多维数组改成n级?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有类似如下的数组:

阵列

    [1g27] =>阵列
        (
            [42] => AAAAA
            [52] => BBBBB
            [4] => 2G4
        )
    [2G4] =>阵列
        (
            [9] => CCCCC
            [14] => 3g14
            [15] => 3g15
            [20] => DDDDD
            [34] => EEEEE
        )
    [3g14] =>阵列
        (
            [49] => FFFFF
        )
    [3g15] =>阵列
        (
            [50] => GGGGG
        )

我想它变成像下面的数组:

阵列

    [1g27] =>阵列
        (
            [42] => AAAAA
            [52] => BBBBB
            [2G4] =>阵列
            (
                [9] => CCCCC
                [3g14] =>阵列
                (
                    [49] => FFFFF
                )
                [3g15] =>阵列
                (
                    [50] => GGGGG
                )
                [20] => DDDDD
                [34] => EEEEE
        )

请注意,原始阵列的值也原始数组中找到的键。当有一个值和一个阵列之间的比赛,我想数组替换值(和重命名该值的键)。

我已经试过的foreach和array_walk_recursive,但我不能弄明白。 (请参见下面的尝试只进1级深)。


功能充气($ flatree,$阵列)
    {
    全球$ inflatedtree;
    的foreach($数组作为$ arraykey => $ arrayvalue)
        {
        $ inflatedtree [$ arraykey] = $ arrayvalue;
        如果(array_key_exists($ arrayvalue,$ flatree))
            {
            $ inflatedtree [$ arrayvalue] = $ flatree [$ arrayvalue];
            膨胀($ flatree,$ inflatedtree [$ arrayvalue]);
            }
        }
    }
膨胀($ flatree,$ flatree ['1g27']);

使用此功能

,但是,给了我这样的:

阵列

    [42] => AAAAA
    [52] => BBBBB
    [2G4] =>阵列
        (
            [9] => CCCCC
            [14] => 3g14
            [15] => 3g15
            [20] => DDDDD
            [34] => EEEEE
        )    [3g14] =>阵列
        (
            [49] => FFFFF
        )
    [3g15] =>阵列
        (
            [50] => GGGGG
        )


解决方案

我由一个地方之一,它的功能是充气的返回值取代全局变量$ inflatedtree()。这个返回值是新建立的分支。

 函数充气($ flatree,$阵列)
{
    $ inflatedtree =阵列();
    的foreach($数组作为$ arraykey => $ arrayvalue){
        如果(array_key_exists($ arrayvalue,$ flatree)){
            $ inflatedtree [$ arrayvalue] =膨胀($ flatree,$ flatree [$ arrayvalue]);
        }其他{
            $ inflatedtree [$ arraykey] = $ arrayvalue;
        }
    }
    返回$ inflatedtree;
}

我用一个函数的start()的初始调用为希望找回阵列。调用膨胀()直接将返回内阵列。

 功能启动($ flatree,$键)
{
    返回数组($关键=>膨胀($ flatree,$ flatree [$关键]));
}$ result_tree =启动($ flatree,'1g27');

I have an array like the following:

Array
(
    [1g27] => Array
        (
            [42] => AAAAA
            [52] => BBBBB
            [4] => 2g4
        )
    [2g4] => Array
        (
            [9] => CCCCC
            [14] => 3g14
            [15] => 3g15
            [20] => DDDDD
            [34] => EEEEE
        )
    [3g14] => Array
        (
            [49] => FFFFF
        )
    [3g15] => Array
        (
            [50] => GGGGG
        )
)

I would like it to become an array like the following:

Array
(
    [1g27] => Array
        (
            [42] => AAAAA
            [52] => BBBBB
            [2g4] => Array
            (
                [9] => CCCCC
                [3g14] => Array
                (
                    [49] => FFFFF
                )
                [3g15] => Array
                (
                    [50] => GGGGG
                )
                [20] => DDDDD
                [34] => EEEEE
        )
)

Notice that the values of the original array are also keys found in the original array. When there is a match between a value and an array, I want the array to replace the value (and rename that value's key).

I have tried foreach and array_walk_recursive, but I can't figure it out. (See following attempt which only goes 1 level deep.)

function inflate($flatree, $array)
    {
    global $inflatedtree;
    foreach ($array as $arraykey => $arrayvalue)
        {
        $inflatedtree[$arraykey] = $arrayvalue;
        if (array_key_exists($arrayvalue, $flatree))
            {
            $inflatedtree[$arrayvalue] = $flatree[$arrayvalue];
            inflate($flatree, $inflatedtree[$arrayvalue]);
            }
        }
    }
inflate($flatree, $flatree['1g27']);

using this function, however, gives me this:

Array
(
    [42] => AAAAA
    [52] => BBBBB
    [2g4] => Array
        (
            [9] => CCCCC
            [14] => 3g14
            [15] => 3g15
            [20] => DDDDD
            [34] => EEEEE
        )

    [3g14] => Array
        (
            [49] => FFFFF
        )
    [3g15] => Array
        (
            [50] => GGGGG
        )
)

解决方案

I replaced the global variable $inflatedtree by a local one, which is the return value of the function inflate(). This return value is the new build branch.

function inflate($flatree, $array)
{
    $inflatedtree = array();
    foreach ($array as $arraykey => $arrayvalue) {
        if (array_key_exists($arrayvalue, $flatree)) {
            $inflatedtree[$arrayvalue] = inflate($flatree, $flatree[$arrayvalue]);
        } else {
            $inflatedtree[$arraykey] = $arrayvalue;
        }
    }
    return $inflatedtree;
}

I use a function start() for the initial call to get back the array as wished. Calling inflate() directly will return the inner array.

function start($flatree, $key)
{
    return array($key => inflate($flatree, $flatree[$key]));
}

$result_tree = start($flatree, '1g27');

这篇关于试问一个2级多维数组改成n级?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆