2016-08-24 22 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; 

}