2016-06-10 49 views
1

我有一個數組分層陣列轉換爲平板陣列

$array = array(
    array(1,2,3), 
    array('bob','bill'), 
    array(4,5,6,7) 
    //can have between 0 and 5 "rows" 
); 

我想轉換到一個數組,看起來像這樣...

[1,bob,4, 1, bob, 5, 1, bob, 6, 1, bob, 7, 1, bill, 4 .... 3, bill, 7] 

我想寫一個遞歸功能爲這看起來像...

function GetValues($array, $rowIndex, $valIndex, $values) 
{ 
    if(!isset($array[$rowIndex])) 
    { 
     return $values; 
    } 
    if(!isset($array[$rowIndex][$valIndex])) 
    { 
     return GetValues($array,$rowIndex+1, 0, $values); 
    } 
    $values[] = $array[$rowIndex][$valIndex]; 

    return GetValues($array,$rowIndex, $valIndex+1, $values); 
} 

剛剛結束了正常迭代數組(打印1,2,3,bob,bill,4,5,6, 7)

+0

參見:http://stackoverflow.com/q/797251/3933332 – Rizier123

+0

@ Rizier123也需要這並不什麼 – EyeOfTheHawks

+0

'$ flatArray = call_user_func_array('array_merge',$ array);' – splash58

回答

2
$array = array(
    array(1,2,3), 
    array('bob','bill'), 
    array(4,5,6,7) 
); 
function combinations($arrays) { 
    $result[] = array(); 
    foreach ($arrays as $key => $values) { 
     $tmp = array(); 
     foreach ($result as $result_item) { 
      foreach ($values as $value) { 
       $tmp[] = array_merge($result_item, array($key => $value)); 
      } 
     } 
     $result = $tmp; 
    } 

    return $result; 
} 
$combinations_array = combinations($array); 
$flat_string = ''; 
$flat_array = array(); 
foreach($combinations_array as $value){ 
     foreach($value as $v){ 
      $flat_string.=$v.','; 
      $flat_array[]=$v; 
     } 
    } 

echo rtrim($flat_string,','); 
print_r($flat_array); 

缺貨將字符串: 1,鮑勃,4,1,鮑勃,5,1,鮑勃,6,1,鮑勃,7,1,票據,4,1,票據,5 ,如圖1所示,紙幣,6,1,票據,7,2,鮑勃,4,2,鮑勃,5,2,鮑勃,6,2,鮑勃,7,2,票據,4,2,票據,5,2 ,票據,6,2,票據,7,3,鮑勃,4,3,鮑勃,5,3,鮑勃,6,3,鮑勃,7,3,票據,4,3,票據,5,3,票據,6,3,票據,7

輸出數組:

Array 
(
    [0] => 1 
    [1] => bob 
    [2] => 4 
    [3] => 1 
    [4] => bob 
    [5] => 5 
    [6] => 1 
    [7] => bob 
    [8] => 6 
    [9] => 1 
    [10] => bob 
    [11] => 7 
    [12] => 1 
    [13] => bill 
    [14] => 4 
    [15] => 1 
    [16] => bill 
    [17] => 5 
    [18] => 1 
    [19] => bill 
    [20] => 6 
    [21] => 1 
    [22] => bill 
    [23] => 7 
    [24] => 2 
    [25] => bob 
    [26] => 4 
    [27] => 2 
    [28] => bob 
    [29] => 5 
    [30] => 2 
    [31] => bob 
    [32] => 6 
    [33] => 2 
    [34] => bob 
    [35] => 7 
    [36] => 2 
    [37] => bill 
    [38] => 4 
    [39] => 2 
    [40] => bill 
    [41] => 5 
    [42] => 2 
    [43] => bill 
    [44] => 6 
    [45] => 2 
    [46] => bill 
    [47] => 7 
    [48] => 3 
    [49] => bob 
    [50] => 4 
    [51] => 3 
    [52] => bob 
    [53] => 5 
    [54] => 3 
    [55] => bob 
    [56] => 6 
    [57] => 3 
    [58] => bob 
    [59] => 7 
    [60] => 3 
    [61] => bill 
    [62] => 4 
    [63] => 3 
    [64] => bill 
    [65] => 5 
    [66] => 3 
    [67] => bill 
    [68] => 6 
    [69] => 3 
    [70] => bill 
    [71] => 7 
) 
+0

真棒,這完美的作品。謝謝 – EyeOfTheHawks

+0

@EyeOfTheHawks我很樂意幫助你。 –

0

你可能會遇到的問題是不知道原始數組有多大。您可以通過銷燬數組來遞歸地編寫它。在這個例子中,我將第一個元素從原始數組中移出。然後,每次遞歸調用時,我都會移除另一個元素。我使用for循環來檢查值並返回我創建的內容。

function flatten($array) 
{ 
    if(sizeof($array)==0) return null; 
    $first = array_shift($array); 
    $ret = array(); 
    foreach($first as $value) 
    { 
     $ret[] = $value; 
     $sub = flatten($array); 
     if($sub != null) 
      $ret = array_merge($ret, $sub); 
    } 
    return $ret; 
} 
+0

我會試試看。數組被破壞的事實不會是一個問題,我可以在調用函數 – EyeOfTheHawks

+0

之前將其複製,但我沒有在函數中通過引用傳遞,所以它將複製數組並銷燬副本。從技術上講,它將複製整個數組,然後是缺少一個元素的數組,然後是缺少一個元素的數組等等... – kainaw

+0

是否可以讓該函數返回問題中指定的數組?我試着把它綁起來,但空白的字符串有點尷尬 – EyeOfTheHawks