[英]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.