我有一个多维数组,如下所示:
$trees = array(
array(
'name' => 'Parent',
'__children' => array(
array(
'name' => 'Child'
),
array(
'name' => 'Second Child'
)
)
)
);
数组的深度未知,我需要以递归方式展平它。所以看起来更像是这样:
array(
array(
'name' => 'Parent'
),
array(
'name' => 'Child'
),
array(
'name' => 'Second Child'
)
)
我觉得这样的事情可能有用:
public function flattenTree($trees, $tree = array())
{
foreach($trees as $item){
//$i = 1, 2, then 3
$i = count($tree);
$tree[$i] = array('name' => $item['name']);
if(isset($item['__children']))
$this->flattenTree($item['__children'], $tree);
}
return $tree;
}
但这只是给了我:(
Array
(
[0] => Array
(
[name] => Parent
)
)
我不确定如何做到这一点。有可能吗?
作为奖励,我真的需要输出数组看起来像这样(注意名称值已更改):)
array(
array(
'name' => 'Parent'
),
array(
'name' => 'Parent Child'
),
array(
'name' => 'Parent Second Child'
)
)
非常感谢你帮忙解决这个问题。期待解决方案。我很难过!
答案 0 :(得分:1)
好的我已经给了它一个镜头,虽然它可能不是最干净的解决方案,我认为它应该完成工作:
function flattenRecursive(array &$flat, $parentkey, array $nested){
$flag = true;
$prepend = '';
foreach( $nested as $k => $val ){
if( is_array($val) ){
if ( $k == '__children' && $flag) {
$prepend = end($flat);
$flag = true;
} else {
$flag = false;
}
flattenRecursive($flat, $prepend , $val);
} else {
$flat[] = $parentkey . ' ' . $val;
}
}
}
function flatten(array $nested){
$flat = array();
flattenRecursive($flat, '', $nested);
return $flat;
}
在测试数组上(具有额外的嵌套以进行额外测试),如下所示
$trees = array(
array(
'name' => 'Parent',
'__children' => array(
array(
'name' => 'Child',
'__children' => array(
array(
'name' => 'Nest One'
),
array(
'name' => 'Nest Two'
)
)
),
array(
'name' => 'Second Child'
)
)
)
);
$result = flatten($trees);
var_dump
的{{1}}如下所示
$result
希望这就是你要找的东西
答案 1 :(得分:0)
我最终使用了这样的东西,并从@Pankrates回答了很多灵感。非常感谢。
$trees = $multidimensionalArray;
$flat = array();
$postRepository->flattenRecursive($flat, $trees);
//$flat is now a flattened version of $multidimensionalArray
var_dump($flat);
public function flattenRecursive(array &$flat, array $nested, $parentPrepend = false)
{
foreach( $nested as $item ){
$flat[] = array(
'name' => ($parentPrepend) ? $parentPrepend . '/' . $item['name'] : $item['name']
);
$prepend = $parentPrepend ? $parentPrepend . '/' . $item['name'] : $item['name'];
if(isset($item['__children']))
$this->flattenRecursive($flat, $item['__children'], $prepend);
}
}
答案 2 :(得分:0)
<强>码强>
<?php
$output_array = array();
$input_array = array(
array(
'name'=>'Parent',
'__children' => array(
array(
'name' => 'Child'
),
array(
'name' => 'Second Child'
)
)
)
);
echo"<pre>";
print_r($input_array);
echo"</pre>";
function flatten($arr){
global $output_array;
if(is_array($arr)){
foreach($arr as $key=>$value){
if($key=="name" && !is_array($value)){
$output_array[] = array($key=>$value);
}
elseif(is_array($value)){
flatten($value);
}
}
}
}
flatten($input_array);
echo"<pre>";
print_r($output_array);
echo"</pre>";
<强>输出强>
//Input array
Array
(
[0] => Array
(
[name] => Parent
[__children] => Array
(
[0] => Array
(
[name] => Child
)
[1] => Array
(
[name] => Second Child
)
)
)
)
//Output Array
Array
(
[0] => Array
(
[name] => Parent
)
[1] => Array
(
[name] => Child
)
[2] => Array
(
[name] => Second Child
)
)
答案 3 :(得分:0)
我有类似的逻辑问题,我使用 @Mike 回答并进行了一些重构。
public function flattenRecursive(array &$flat, array $nested, $parentPrepend = false)
{
foreach( $nested as $item ){
$prepend = $parentPrepend ? $parentPrepend . '/' . $item['name'] : $item['name'];
$flat[] = array(
'name' => $prepend
);
if(isset($item['__children']))
$this->flattenRecursive($flat, $item['__children'], $prepend);
}
}