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)
这是一种有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的答案,只是使用不同的变量名,所以......就是这样.
这个函数递归地工作并完成了任务:
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.