2013-06-26 24 views
1

所以我试图创建一个递归flattenArray函数,将采取一个数组(与未知数量的元素和子数组(可能更多的子数组)麻烦:array_push:我的递归平坦数组函数似乎重置最终数组?

<?php 
// Javascript Array [ [1,2,3],[[[4]]],[5],[6],[[7,8,[9]]] ] 
// Equivalent PHP Array: 
$sampleArray = Array(
    Array(1,2,3), 
    Array(
     Array(
      Array(4) 
     ) 
    ), 
    Array(5), 
    Array(6), 
    Array(
     Array(
      7, 
      8, 
      Array(9) 
     ) 
    ) 
); 

$finishedArray = Array(); 

function flattenArray($array){ 
    foreach ($array as $key => $value) { 
     if(is_array($value)){ 
      flattenArray($value); 
     } else { 
      $finishedArray[] = $value; 
      echo "<br> ".$value." | "; 
      print_r($finishedArray); 
     } 
    } 
} 

flattenArray($sampleArray); 

echo "<br><br>FinishedArray: <br>"; 
print_r($finishedArray); 
?> 

我得到这个输出。

1 | Array ([0] => 1) 
2 | Array ([0] => 1 [1] => 2) 
3 | Array ([0] => 1 [1] => 2 [2] => 3) 
4 | Array ([0] => 4) 
5 | Array ([0] => 5) 
6 | Array ([0] => 6) 
7 | Array ([0] => 7) 
8 | Array ([0] => 7 [1] => 8) 
9 | Array ([0] => 9) 

FinishedArray: 
Array () 

出于某种原因,重置$ finishedArray 我在做什么错在这里

回答

2

似乎你需要阅读variable scope。有两个变量叫$finishedArray - 一个在主脚本中,另一个在函数内。可能最简单的解决办法是通过参考来传递它:

function flattenArray($array, &$finishedArray){ 
    foreach ($array as $key => $value) { 
     if(is_array($value)){ 
      flattenArray($value, $finishedArray); 
     } else { 
      $finishedArray[] = $value; 
     } 
    } 
} 

$finishedArray = Array(); 
flattenArray($sampleArray, $finishedArray); 
+0

谢谢!我看到你的回复后甚至找到了一个更简单的修复方法: 我把“global $ finishedArray;”在“函数flattenArray($ array){”和foreach语句之间。像魅力一样工作! – Boro