【问题标题】:How can a 2 level multidimensional array be changed to n levels?如何将 2 级多维数组更改为 n 级?
【发布时间】:2014-10-14 14:27:42
【问题描述】:

我有一个如下数组:

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

我希望它变成如下的数组:

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

请注意,原始数组的值也是原始数组中的键。当值和数组匹配时,我希望数组替换该值(并重命名该值的键)。

我尝试过 foreach 和 array_walk_recursive,但我想不通。 (请参阅以下仅深入 1 级的尝试。)

函数膨胀($flatree,$array) { 全球$inflatedtree; foreach ($array as $arraykey => $arrayvalue) { $inflatedtree[$arraykey] = $arrayvalue; if (array_key_exists($arrayvalue, $flatree)) { $inflatedtree[$arrayvalue] = $flatree[$arrayvalue]; 膨胀($flatree,$inflatedtree[$arrayvalue]); } } } 膨胀($flatree,$flatree['1g27']);

然而,使用这个函数给了我这个:

数组
(
    [42] => AAAAA
    [52] => BBBBB
    [2g4] => 数组
        (
            [9] => 中交
            [14] => 3g14
            [15] => 3g15
            [20] => DDDDD
            [34] => EEEEE
        )

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

【问题讨论】:

  • 向我们展示您迄今为止的尝试
  • 我刚刚在上面加了,@iswinky
  • @James,我的问题是:我怎样才能将一个 2 层深的数组变成一个 n 层深的数组?我只是想知道这是否可以做到以及如何做到。
  • 它可以做到,只要它是一个正当的理由(即通常最好在源头上将其设置为 3 级深度 - 当它被创建时)。你如何做取决于你想成为一个新的子数组的当前键和值对 - 即你的例子,当你创建新的子级别数组时,它是否总是2g4你从(等)拆分?另外,您希望这样做的原因是什么?我不知道你的问题,我可能是错的,但看起来你过于复杂了。即我不明白为什么2g4 需要是1g27 的数组,而不是它自己的顶级数组。
  • @James,我同意人们不妨一开始就以这种方式创建数组。这更像是一个概念性的东西,我正在尝试扩展我的想法。

标签: php arrays multidimensional-array


【解决方案1】:

我用局部变量替换了全局变量 $inflatedtree,它是函数 inflate() 的返回值。这个返回值就是新的构建分支。

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;
}

我使用函数 start() 进行初始调用,以根据需要取回数组。直接调用 inflate() 会返回内部数组。

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

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

【讨论】:

    【解决方案2】:

    我看不出为什么您的代码应该只深入一层。看来您正在正确调用递归函数。唯一的错误是密钥没有重命名,而是复制到了一个新名称。您需要像这样删除旧值

    function inflate($flatree, $array)
    {
    global $inflatedtree;
    foreach ($array as $arraykey => $arrayvalue)
        {
        $inflatedtree[$arraykey] = $arrayvalue;
        if (array_key_exists($arrayvalue, $flatree))
            {
            unset($inflatedtree[$arraykey]);
            //now the new stuff is only at $arrayvalue, not $arraykey
            $inflatedtree[$arrayvalue] = $flatree[$arrayvalue];
            inflate($flatree, $inflatedtree[$arrayvalue]);
            }
        }
    }
    inflate($flatree, $flatree['1g27']);
    

    如果您的代码在示例数据上运行并没有给出示例结果,那么请发布它生成的数组。

    【讨论】:

    • 感谢@Kyborek。我只是在原始问题中添加了一个函数(即使未设置)给我的示例
    猜你喜欢
    • 2016-08-28
    • 2021-11-26
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2020-11-28
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多