在PHP中从数组构建多维数组

Kve*_*ven 6 php arrays recursion function multidimensional-array

我想从数组构建一个多维数组.比如我想

$test = array (
0 => 'Tree',
1 => 'Trunk',
2 => 'Branch',
3 => 'Limb',
4 => 'Apple',
5 => 'Seed'
);
Run Code Online (Sandbox Code Playgroud)

成为

$test = 
array (
   'Tree' => array (
       'Trunk' => array (
           'Branch'  => array (
               'Limb'  => array (
                   'Apple'  => array (
                       'Seed' => array ()
                   )
               )
           )
       )
   )
);
Run Code Online (Sandbox Code Playgroud)

或者更简单

$result[Tree][Trunk][Branch][Limb][Apple][Seed] = null;
Run Code Online (Sandbox Code Playgroud)

我试图用递归函数做这个,但是我达到内存限制,所以我显然做错了.

<?php
$test = array (
0 => 'Tree',
1 => 'Trunk',
2 => 'Branch',
3 => 'Limb',
4 => 'Apple',
5 => 'Seed'
);



print_r($test);





print "results of function";

print_r(buildArray($test));



function buildArray (&$array, &$build = null)
{
    if (count($array) > 0)
    {

        //create an array, pass the array to itself removing the first value



        $temp = array_values($array);   
        unset ($temp[0]);           
        $build[$array[0]] =  $temp;


        buildArray($build,$temp);



        return $build;
    }

    return $build;


}
Run Code Online (Sandbox Code Playgroud)

Sig*_*uza 8

这是一种有foreach和没有递归的方法,它有效:

function buildArray($array)
{
    $new = array();
    $current = &$new;
    foreach($array as $key => $value)
    {
        $current[$value] = array();
        $current = &$current[$value];
    }
    return $new;
}
Run Code Online (Sandbox Code Playgroud)

[ 演示 ]

现在你的函数......首先,使用$build[$array[0]]而不将其定义为数组首先产生一个E_NOTICE.其次,你的函数会进入无限递归,因为你实际上并没有修改$array($temp不一样),所以count($array) > 0永恒都是如此.
即使你正在修改$array,你也不能再使用$array[0],因为你取消了它,并且索引不会只是向上滑动.你需要array_shift那个.
在这之后,你通过$build$temp你的功能,因为你现在你分配导致进一步$build$temp,因此建立在你已经无限经常性循环另一个循环.

我试图在你的代码中修复上述所有内容,但最终意识到我的代码现在几乎完全是Pevara的答案,只是使用不同的变量名,所以......就是这样.


Pev*_*ara 2

这个函数递归地工作并完成了任务:

function buildArray($from, $to = []) {  
    if (empty($from)) { return null; }
    $to[array_shift($from)] = buildArray($from, $to);
    return $to;
}
Run Code Online (Sandbox Code Playgroud)

在您的代码中,我希望您看到一个错误。您在第一次迭代中正在与 进行对话$build,就好像它是一个数组,而您已将其默认为null.