我正在尝试从线性数组创建一个多维数组。
这个数组:
$array = array(
array('level-one', 'level-two', 'level-three'),
array('level-one', 'level-two', 'level-three', 'level-four'),
array('level-one', 'level-two', 'level-three', 'level-four', 'item 1'),
array('level-one', 'level-two', 'level-three', 'level-four', 'item 2'),
array('level-one', 'level-two', 'level-three', 'level-four', 'item 3'),
array('level-one', 'level-two', 'level-three', 'level-four', 'item 4'),
);
分为:
$multi = array(
'level-one' => array(
'level-two' => array(
'level-three' => array(
'level-four' => array(
'item 1',
'item 2',
'item 3',
'item 4',
)
)
)
)
);
我想我应该以某种方式递归,但我找不到递归解决方案逻辑。
答案 0 :(得分:1)
你可以试一试
function to_nested($ary){
$a = array();
foreach ( $ary as $rec ){
$b = &$a;
$node = null;
foreach ( $rec as $f ){
if ( $node !== null ){
if ( !isset($b[$node]) ){
$isleaf = array_search($node,$b);
if ( $isleaf !== false )
unset($b[$isleaf]);
$b[$node] = array();
}
$b = &$b[$node];
}
$node = $f;
}
//push leaf
if ( empty($b) ){
$b = array();
}
array_push($b, $f);
}
return $a;
}
$array = array(
array('level-one', 'level-two', 'level-three'),
array('level-one', 'level-two', 'level-three', 'level-four'),
array('level-one', 'level-two', 'level-three', 'level-four', 'item 1'),
array('level-one', 'level-two', 'level-three', 'level-four', 'item 2'),
array('level-one', 'level-two', 'level-three', 'level-four', 'item 3'),
array('level-one', 'level-two', 'level-three', 'level-four', 'item 4'),
);
print_r(to_nested($array));
结果:
Array (
[level-one] => Array
(
[level-two] => Array
(
[level-three] => Array
(
[level-four] => Array
(
[0] => item 1
[1] => item 2
[2] => item 3
[3] => item 4
)
)
)
)
)
我不确定您的输入数组的规则是什么,因此我建议您使用不同的有效输入来查看此函数的结果是否适合您。
答案 1 :(得分:1)
尝试
$data=array();
for($i=0;$i<sizeof($array);$i++){
$tmp=array();
$data = array_unique(array_merge($data,$array[$i]));
}
现在删除了重复的条目。 现在创建一个多维数组
$output=array();
$tmp = &$output;
foreach($data as &$val){
if(strpos($val,'level') !==false ){
if (!is_array($tmp)){
$tmp = array();
}
$tmp = &$tmp[$val];
}else{
$tmp[] = $val;
}
}
echo "<pre>";
print_r($output);
exit();
答案 2 :(得分:1)
$last_array = end($array);
// Create an array like your structure, i.e.
// ['level-one', 'level-two', 'level-three', 'level-four'].
$structure = array_slice($last_array, 0, -1);
// Remove all arrays, but the ones with items.
$neat_array = array_filter($array, function($current_array) use ($last_array) {
return sizeof($current_array) === sizeof($last_array);
});
// Create an array of just your items, i.e.
// ['item 1', 'item 2', 'item 3', 'item 4'].
$items = array_map(function($item) use ($structure) {
return $item[sizeof($structure)];
}, $neat_array);
// And the final product.
$multi = array_reduce(array_reverse($structure), function($result, $item) {
return array($item => $result);
}, $items);
print_r($multi);
输出将符合要求:
Array
(
[level-one] => Array
(
[level-two] => Array
(
[level-three] => Array
(
[level-four] => Array
(
[2] => item 1
[3] => item 2
[4] => item 3
[5] => item 4
)
)
)
)
)
答案 3 :(得分:0)
$array1=array(
'level1'=>array(
'level2'=>array(
'level3'=>array(
'level4'=>array(
'A'=>'value1',
'B'=>'value2',
'C'=>'value3',
'D'=>'value4'
)
)
)
)
);
print_r($array1);