doupian6118 2014-10-14 14:27
浏览 42
已采纳

如何将2级多维数组更改为n级?

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
        )
)
  • 写回答

2条回答 默认 最新

  • doumi4974 2014-10-14 18:17
    关注

    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');
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?