PHP - 递归替换数组键并将值更改为包括旧键的数组

时间:2015-04-25 05:52:40

标签: php recursion multidimensional-array

我花了一段时间试图从旧的答案中得到我需要的东西,但还没有得到它(尽管已经接近了!)。

我有这个;

[January] => Array
    (
        [Tuesday] => Array
            (
                [foo] => Array
                    (
                        [82] => 47731
                        [125] => 19894
                    )

                [bar] => Array
                    (
                        [82] => 29911
                        [125] => 10686
                    )

            )

    }

......我想要这个;

[0] => Array
    (
       'key' => 'January'
       'children' => Array
            [0] => Array 
                {
                    'key' => 'Tuesday'
                    'children' => Array 
                         [0] => Array 
                              {
                                  'key' => 'foo'
                                  'values' => Array
                                        {
                                             [82] => 47731
                                             [125] => 19894
                                        }
                         [1] => Array
                              {
                                  'key' => 'bar'
                                  'values' => Array
                                        {
                                             [82] => 29911
                                             [125] => 10686
                                        }
                              }
                )
    }

我通过调整Recursively change keys in array的第一个答案得到了相当接近但只有我的结果的底层是正确的 - 带有键的节点'星期二',' FOO'和' bar'看起来与源数组中的相同。

这是我到目前为止所做的事情;

public function transform_hierarchical_output(&$var)
{       
    if (is_array($var)) 
    {
        $final = [];

        $i = 0;

        foreach ($var as $k => &$v) 
        {
            $new_node = [
                'key'       => $k,
                'children'  => $v
            ];

            $k = $i;

            $this->transform_hierarchical_output($v);

            $final[$k] = $new_node;

            $i++;
        }

        $var = $final;
    } 
    elseif (is_string($var)) 
    {

    }
}

这需要使用任何长度和深度的源数组。

提前致谢。

杰夫

3 个答案:

答案 0 :(得分:3)

<?php

$array = [
    'January' => [
        'Tuesday' => [
            'foo' => [
                82 => 47731,
                125 => 19894,
            ],

            'bar' => [
                82 => 47731,
                125 => 19894,
            ]
        ]
    ]
];

function transform(array $input)
{
    $output = [];

    foreach ($input as $key => $val) {
        if (is_array(array_values($val)[0])) { // if next depth is an array
            $output[] = [
                'key'       => $key,
                'children'  => transform($val)
            ];
        } else {
            $output[] = [
                'key'    => $key,
                'values' => $val
            ];
        }
    }

    return $output;
}

print_r(transform($array));

答案 1 :(得分:2)

尝试以下:

function t($arr)
    {

        $a = [];

        $num = 0;
        foreach($arr as $k => $v) {
            if (is_array($v))
            {
                $a[$num] = [
                    'key' => $k,
                ];
                $a[$num][is_array(array_values($v)[0]) ? 'children' : 'values'] = t($v);
                $num ++;
            } else {
                $a[$k] = $v;
            }
        }
        return $a;
    }

答案 2 :(得分:0)

我要注意的第一件事是,虽然你的例子中有很多递归,但从技术上讲,它不是一个递归循环,而是需要一个自执行函数。因为你的循环方案在其深度上有一点波动,所以它不遵循常规模式直到最后一个节点;但它是一个逻辑方案,但不会重复到最后一个节点。

以下功能可能适用于您:

function doArray($array)
{
    $keys = array_keys($array);
    $arr_count = count($keys);
    $new_array;

    for($i = 0; $i < $arr_count; $i++)
    {
        $new_array[$i]["key"] = $keys[$i];

        $new_keys = array_keys($array[$keys[$i]]);

        for($w = 0; $w < count($new_keys); $w++)
        {
            $new_array[$i]["children"][$w]["keys"] = $new_keys[$i];
            $new_array[$i]["children"][$w]["children"] = array();
            for($w = 0; $w < count($new_keys); $w++)
            {
                $new_new_keys = array_keys($array[$keys[$i]][$new_keys[$w]]);
                for($q = 0; $q < count($new_new_keys); $q++)
                {
                    $new_array[$i]["children"][$w]["children"][$q]["key"] = $new_new_keys[$q];
                    //$new_array[$i]["children"][$w]["children"][$q]["children"] = $array[$keys[$i]][$new_keys[$w]][$new_new_keys[$q]];

                    $last_new_keys = array_keys($array[$keys[$i]][$new_keys[$w]][$new_new_keys[$q]]);
                    for($s  = 0; $s < count($last_new_keys); $s++)
                    {
                        $new_array[$i]["children"][$w]["children"][$q]["values"][$last_new_keys[$s]] = $array[$keys[$i]][$new_keys[$w]][$new_new_keys[$q]][$last_new_keys[$s]];
                    }
                }

            }
        }

    }

    return $new_array;
}
相关问题