2013-04-23 105 views
1

比方說,我有一個數組是這樣的:遞歸元素添加到數組並返回新的數組

$my_array = array(1, 2, 3, 4, array(11, 12, 13, 14), 6, 7, 8, array(15, 16, 17, 18), 10); 

我想建立一個返回一個包含my_array所有的偶數數組遞歸函數。我試過類似的東西:

function get_even_numbers($my_array) 
{ 
    $even_numbers = array(); 

    foreach($my_array as $my_arr) 
    { 
     if(is_array($my_arr) 
     { 
      get_even_numbers($my_arr); 

      foreach($my_arr as $value) 
      { 
       if($value % 2 == 0) 
       { 
        $even_numbers[] = $value; 
       } 
      } 
     } 
    } 

    return even_numbers; 
} 

但它不起作用。

謝謝

+0

那麼什麼是你的問題?你知道你想做什麼,所以去做吧。 – 2013-04-23 00:48:14

+0

爲什麼你想要這個函數是遞歸的? – ryanbwork 2013-04-23 00:49:50

+0

for循環更適合此輸入 – wayne 2013-04-23 00:50:45

回答

2

很簡單:

  1. 檢查,如果你進入了功能的輸入是一個數組。
  2. 如果是這樣,這意味着你必須遍歷數組的值,並調用你的函數(所以它是遞歸的)
  3. 否則,只要檢查進來的值是否是偶數,並將其添加到數組返回。

也就是說,在PHP中,看起來像:

function recursive_even($input) { 
    $even = array(); 
    if(is_array($input)) { 
     foreach($input as $el) { 
      $even = array_merge($even, recursive_even($el)); 
     } 
    } 
    else if($input % 2 === 0){ 
     $even[] = $input; 
    } 
    return $even; 
} 
2

除非它是一個思想鍛鍊自己的薰陶,實現遞歸函數並不需要這個任務,它可以完成,而不是通過使用更高階的內置PHP函數array_walk_recursive

$res = array(); 
array_walk_recursive($my_array, function($a) use (&$res) { if ($a % 2 == 0) { $res[] = $a; } }); 

當然,這可以被包裹在一個函數:

function get_even_numbers($my_array) { 
    $res = array(); 
    array_walk_recursive($my_array, function($a) use (&$res) { if ($a % 2 == 0) { $res[] = $a; } }); 
    return $res; 
}