2016-06-10 60 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