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

3

我花了一段时间尝试从旧的答案中获取所需内容,但还没有完全得到(虽然已经接近了!)。

我有这个:

[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
                                        }
                              }
                )
    }

我通过修改递归更改数组中的键的第一个答案已经接近了,但是我的结果只有底层是正确的——具有“Tuesday”、“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)) 
    {

    }
}

这需要与任何长度和深度的源数组一起工作。
提前感谢。
Geoff

为什么foobar的子元素使用values,而其他的使用children?这里有任何逻辑吗? - Passerby
最终,每个节点都会想要一组值,但我想现在先不考虑它! - Geoff Clayton
3个回答

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接