簡體   English   中英

在PHP中從數組構建多維數組

[英]Build multidimensional array from an array in PHP

我想從數組構建一個多維數組。 比如我想

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


}

這是一個foreach和沒有遞歸的方法,它有效:

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

[ 演示 ]

現在你的函數......首先,使用$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;
}

在您的代碼中,我希望您看到錯誤。 你在第一次迭代中討論$build ,就好像它是一個數組,而你將它默認為null

這似乎很容易

$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 ( ), ), ), ), ), ), )

使用指針,繼續重新指向它。 您的兩個輸出示例為最深的值提供了array()null ; 這給了array()但是如果你想要null ,則替換$p[$value] = array(); $p[$value] = $test ? array() : null; $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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM