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

时间:2015-05-15 18:16:38

标签: php arrays function recursion multidimensional-array

我想从数组构建一个多维数组。例如,我想

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


}

4 个答案:

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