Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-递归地替换数组键,并将值更改为包含旧键的数组_Php_Recursion_Multidimensional Array - Fatal编程技术网

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

PHP-递归地替换数组键,并将值更改为包含旧键的数组,php,recursion,multidimensional-array,Php,Recursion,Multidimensional Array,我花了一段时间试图从旧的答案中得到我需要的东西,但还没有完全得到(尽管已经接近了!) 我有这个 [January] => Array ( [Tuesday] => Array ( [foo] => Array ( [82] => 47731 [125] =&g

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

我有这个

[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
                                        }
                              }
                )
    }
通过调整来自的第一个答案,我得到了非常接近的结果,但只有结果的最底层是正确的——带有“星期二”、“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)) 
    {

    }
}
这需要使用任意长度和深度的源数组

提前谢谢

杰夫试试下面的方法:

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

我应该注意的第一件事是,尽管在您的示例中有许多递归,但从技术上讲,就需要一个自执行函数而言,它不是一个递归循环。因为循环的方案在深度上有点波动,所以它在最后一个节点并没有遵循规则模式;不过,这是一个逻辑方案,但不会一直重复到最后一个节点

以下功能可能适用于您:

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;
}
函数doArray($array)
{
$keys=数组\ U键($array);
$arr_count=计数($keys);
$new_阵列;
对于($i=0;$i<$arr\u count;$i++)
{
$new_数组[$i][“key”]=$keys[$i];
$new_keys=数组_keys($array[$keys[$i]]);
对于($w=0;$w
为什么
用于
foo
bar
的子项,而
子项
用于其他子项?这里有什么逻辑吗?最终每个节点都需要一组值,但我想我现在就不需要了!这很有效。如果我能选择多个答案,我会的!只勾选了另一个,因为它是第一个。谢谢你的输入。Ace。谢谢你抽出时间。
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;
}