2012-11-18 64 views
0

我有一个多维数组,看起来像这样:递归遍历多维打造扁平阵列

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

) 

我不确定该怎么办这是否有可能?

作为奖励,我真的需要输出数组看起来像这样(注意名称值cha中年):)

array(
    array(
    'name' => 'Parent' 
), 
    array(
    'name' => 'Parent Child' 
), 
    array(
    'name' => 'Parent Second Child' 
) 
) 

非常感谢大家的帮助。期待解决方案。我很难过!

+0

的可能重复的[如何拼合多维数组?](http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array) –

+0

你不能指定没有索引的数组元素。我相信你现在得到了正确的输出 –

+0

是你的问题是从数组中缺少子元素? –

回答

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); 
    } 
} 
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; 
} 

在测试阵列(额外的测试额外的嵌套)如下的$result

$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如下所示

array(5) { 
    [0]=> 
    string(7) " Parent" 
    [1]=> 
    string(13) " Parent Child" 
    [2]=> 
    string(22) " Parent Child Nest One" 
    [3]=> 
    string(22) " Parent Child Nest Two" 
    [4]=> 
    string(20) " Parent Second Child" 
} 

希望这是你正在寻找的

+0

嗨Pankrates,我认为你在这里的东西。然而,这对我来说不起作用。b/c数组比这更复杂,并且使用foreach($ nested作为$ k => $ val)正在抛出一些东西。你可以翻译这个,所以它使用foreach($嵌套为$ item),而不是? – Mike

+0

你可以给一个失败的例子数组,它失败了吗?难以准确找出你的意思没有例子 – Pankrates

+0

看到我的答案,再次感谢你的努力!它帮助了很多。 – Mike

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 
     ) 

)