2016-08-24 59 views
0

一个新的阵列时,我坚持的东西,可能是很简单的如何“跳过” itteration。建设使用递归

我用递归函数但我似乎无法获取值粘到新阵列通过现有的阵列循环创建一个新的阵列。该功能最终会更复杂一些,但现在我需要一些帮助。

我已经尝试了SOOOO许多方法来得到这个工作,但我很茫然现在。

这里是我的PHP函数

function recursive($array) { 

    $newArray = array(); 

    foreach($array as $key => $value) { 

     if(is_array($value)){ 
      recursive($value);        
     }else{ 
      $newArray[] = $value; 
     } 

    } 

    return $newArray; 

} 

原样,新阵列永远不会被填补......可是,如果我改变这一行...

recursive($value); // Why can't I just call the recursive function here? 

...来。 ..

$newArray[] = recursive($value); // Instead of having to set a new value to the new array? 

一切工作正常......除了我的目标是创建一个只有值的平面数组。

所以我的问题是,为什么有必要为了再次调用递归函数设置一个新的数组值?理想情况下,如果值是一个数组,并且只是继续通过原始数组的循环,我想跳过设置新的数组值。

在解释将是巨大的帮助!

+0

你可能想阅读[array merge](http://php.net/manual/en/function.array-merge.php)。 – JohannesB

+0

我想我应该做出答案而不是评论 – JohannesB

+0

谢谢大家的好评! – VIDesignz

回答

2

使用array_merge

function recursive($array) { 

    $newArray = array(); 

    foreach($array as $key => $value) { 

     if(is_array($value)){ 
      $newArray = array_merge($newArray, recursive($value));        
     }else{ 
      $newArray[] = $value; 
     } 

    } 

    return $newArray; 

} 

...或者你可以使用special operator

function recursive($array) { 

    $newArray = array(); 

    foreach($array as $key => $value) { 

     if(is_array($value)){ 
      $newArray += recursive($value);        
     }else{ 
      $newArray[] = $value; 
     } 

    } 

    return $newArray; 

} 

...或通过一个variable by reference这样的:

function recursive($array, &$newArray = null) { 

    if (!$newArray) { 
     $newArray = array(); 
    } 

    foreach($array as $key => $value) { 

     if(is_array($value)){ 
      recursive($value, $newArray);        
     }else{ 
      $newArray[] = $value; 
     } 

    } 

    return $newArray; 
} 
+0

我可以问你一个相关的问题吗?当每个循环返回$ newArray时,它是否总是所有其他循环的总和?我只是对退货时实际发生的事情感到困惑。 – VIDesignz

+0

是的,它总是所有其他周期的总和。你读过'array_merge' http://php.net/array_merge吗? – ofca

1

使用array_merge()到数组合并来自recursive($value);返回和$ newArray

$newArray = array_merge($newArray,recursive($value)); 

可以保证$newArray将是在此之后持平,为$newArray于前值持平,而recursive总是返回一个平坦的阵列,所以两者的组合应该是一个平面阵列。

1

你不是活得不要对你递归函数的返回做任何事情。试试这个:

function recursive($array) { 

    $newArray = array(); 

    foreach($array as $key => $value) { 

     if(is_array($value)){ 
      // This is what was modified 
      $newArray = array_merge($newArray, recursive($value));        
     }else{ 
      $newArray[] = $value; 
     } 

    } 

    return $newArray; 

}