我想从数组构建一个多维数组。例如,我想
$test = array (
0 => 'Tree',
1 => 'Trunk',
2 => 'Branch',
3 => 'Limb',
4 => 'Apple',
5 => 'Seed'
);
成为
$test =
array (
'Tree' => array (
'Trunk' => array (
'Branch' => array (
'Limb' => array (
'Apple' => array (
'Seed' => array ()
)
)
)
)
)
);
或更简单
$result[Tree][Trunk][Branch][Limb][Apple][Seed] = null;
我尝试使用递归函数执行此操作,但我遇到了内存限制,所以我显然做错了。
<?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;
}
答案 0 :(得分:8)
这是一种foreach
并且没有递归的方法,有效:
function buildArray($array)
{
$new = array();
$current = &$new;
foreach($array as $key => $value)
{
$current[$value] = array();
$current = &$current[$value];
}
return $new;
}
[Demo]
现在你的函数......首先,使用$build[$array[0]]
而不将其定义为数组首先产生E_NOTICE
。
其次,你的函数正在进行无限递归,因为你实际上并没有修改$array
($temp
不是相同的),所以count($array) > 0
将永远为真。<登记/>
即使您正在修改$array
,也无法再使用$array[0]
,因为您取消了这一点,并且索引不会向上滑动。你需要array_shift
。
之后,您将$build
和$temp
传递给您的函数,这会进一步导致您因为现在将$build
分配给$temp
,因此您已经无限制地创建了另一个循环 - 重复循环。
我试图在您的代码中修复上述所有内容,但最终意识到我的代码现在几乎就是来自Pevara's answer的代码,只是使用了不同的变量名称,所以......那个&#39;那个。
答案 1 :(得分:2)
此函数以递归方式工作并执行操作:
function buildArray($from, $to = []) {
if (empty($from)) { return null; }
$to[array_shift($from)] = buildArray($from, $to);
return $to;
}
在您的代码中,我希望您看到错误。您正在第一次迭代中与$build
交谈,就好像它是一个数组,而您已将其默认为null
。
答案 2 :(得分:2)
似乎很容易
$res = array();
$i = count($test);
while ($i)
$res = array($test[--$i] => $res);
var_export($res);
返回
array ( 'Tree' => array ( 'Trunk' => array ( 'Branch' => array ( 'Limb' => array ( 'Apple' => array ( 'Seed' => array ( ), ), ), ), ), ), )
答案 3 :(得分:0)
使用指针,继续重新指向它。您的两个输出示例为array()
和null
提供了最深的值;这会array()
,但如果您需要null
,请将$p[$value] = array();
替换为$p[$value] = $test ? array() : null;
$test = array(
'Tree',
'Trunk',
'Branch',
'Limb',
'Apple',
'Seed'
);
$output = array();
$p = &$output;
while ($test) {
$value = array_shift($test);
$p[$value] = array();
$p = &$p[$value];
}
print_r($output);