2009-12-28 40 views
1

我想創建一個包含現有多維數組的所有值的單個數組。這是我到目前爲止有:試圖從多維(遞歸)數組中拉出所有值

function MaxArray($arr) { 

    foreach ($arr as $value) { 

     if (is_array($value)) { 
      MaxArray($value); 
     } else { 
      $array[] = $value; 
     } 
    } 
    print_r($array); 

} 

$arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404, array(1,2)))); 

MaxArray($arr); 

當我執行這個代碼,我從print_r的功能,這種反應...

Array ([0] => 141 [1] => 151 [2] => 161) Array ([0] => 1 [1] => 2) Array ([0] => 303 [1] => 404) Array ([0] => 101 [1] => 202) Array ([0] => 2 [1] => 3) 

正如你所看到的,這不是我是誰尋找,我不知道如何將多維數組中的所有值組合到一個數組中。任何人都可以請在這裏指出我正確的方向嗎?

回答

5

你試圖做的是通常被稱爲「陣列壓扁」,所以ArrayFlatten可能比MaxArray功能更好的名字(因爲喜歡後者的聲音將在陣列中返回的最高值,這max做得很好)。 ArrayFlatten可以這樣寫:

function ArrayFlatten($array, $return) { 
    for ($x = 0; $x < count($array); $x++) { 
    if(is_array($array[$x])) { 
     $return = ArrayFlatten($array[$x], $return); 
    } 
    else { 
     if($array[$x]) { 
     $return[] = $array[$x]; 
     } 
    } 
    } 

    return $return; 
} 

而且像這樣使用:

$myarray = array('a','b',array(array(array('x'),'y','z')),array(array('p')));  
$res = ArrayFlatten($myarray,array()); 

爲了得到這個:

 
Array 
(
    [0] => a 
    [1] => b 
    [2] => x 
    [3] => y 
    [4] => z 
    [5] => p 
) 

here

+0

感謝您的快速回復,你的功能,除了它顯示了一堆看起來像這樣的通知錯誤的偉大的工作。 .. 注意:未定義偏移量:3在/Users/Devin/Sites/mywebapp/query.php在線16 任何想法是什麼導致這些錯誤? – 2009-12-28 20:29:01

+1

'$ x <= count($ array)'測試應該是'$ x outis 2009-12-28 21:14:16

+0

@Devin - 道歉,@outis - 謝謝。編輯! – 2009-12-28 21:42:59

0

$ array是在MaxArray()的每次執行中重新創建和打印的。你需要在所有的遞歸執行中構建它。我認爲最好的方法是讓MaxArray()函數返回該數組而不是將其打印出來。 ......當我打字時,多米尼克羅傑已經爲你做了!

0

下面是示出了使用的foreach和防腐劑的(部分的)字符串鍵另一變型。

function array_flatten($array) { 
    $rslt = array(); 
    foreach ($array as $key => $val) { 
     if (is_array($val)) { 
      $rslt = array_merge($rslt, array_flatten($val)); 
     } elseif (is_int($key)) { 
      $rslt[] = $val; 
     } else { 
      // for string keys, earlier values are overwritten with later ones 
      $rslt[$key] = $val; 
     } 
    } 
    return $rslt; 
} 

對於不同的碰撞行爲,更改$rslt[$key] = $val;行。

0

,如果你只希望輸出的遞歸陣列的最大值,使用該

function MaxArray($arr) { 
    $max = 0; 
    foreach($arr as $a) 
    { 
    if(is_array($a)) { 
    $max = MaxArray($a); 
    } else if($a > $max){ 
    $max = $a; 
    } 
} 
return $max; 
}