2013-07-29 27 views
3

你們中的任何一個都可能已經完成了我在下面提到的這種類型的組合。我需要的排列組合

$data = array 
(
    'a1' => array(7, 32,44), 
    'a2' => array(4,44), 
    'a3' => array(9,33,55) 
); 

如果我嘗試檢索n次,此返回應該是這樣的。假設n = 4(o至3)。

Array 
(
    [0] => Array 
     (
      [0] => 7 // from a1 
      [1] => 4 // from a2 
      [2] => 9 // from a3   
     ) 

    [1] => Array 
     (
      [0] => 32 
      [1] => 44 
      [2] => 33   
     ) 

    [2] => Array 
     (
      [0] => 44 
      [1] => 4 
      [2] => 55   
     ) 


    [3] => Array 
     (
      [0] => 7 
      [1] => 44 
      [2] => 9   
     ) 
) 

等等....

+0

當將第n項分配給結果數組時,在索引n模數源數組長度處添加源項.. –

+0

http://stackoverflow.com/a/6882417/342740 – Prix

+0

您的問題是什麼? –

回答

3

%操作是你的朋友:

function foo($arr, $n) { 
    $result = array(); 
    for ($i = 0; $i < $n; $i++) { 
    $result[$i] = array_map(function($value) use ($i) { 
     return $value[$i % count($value)]; 
    }, $arr); 
    } 
    return $result; 
} 

// usage: 
var_dump(foo($data, 4)); 
2

我會打電話到該操作的「模塊化拉鍊」,因爲它在與Python的zip函數類似,封裝在前端。使用數組next函數而不是數字模運算符,該運算符速度更快。

$array_list應該是數組列表;不執行數據類型檢查。

<?php 

function zip_modular($len, $array_list) { 
    $out = array(); 

    for($n = 0; $n < $len; $n++) { 
    $out[$n] = array(); 
    foreach($array_list as &$arr) { 
     $cur = current($arr); 
     if(empty($cur)) { 
     reset($arr); 
     } 
     $out[$n][] = current($arr); 
     next($arr); 
    } 
    } 

    return $out; 
} 

// example 
print_r(zip_modular(4, [[7, 32, 44], [4, 44], [9, 33, 55]])); 

/* 
Array 
(
    [0] => Array 
     (
      [0] => 7 
      [1] => 4 
      [2] => 9 
     ) 

    [1] => Array 
     (
      [0] => 32 
      [1] => 44 
      [2] => 33 
     ) 

    [2] => Array 
     (
      [0] => 44 
      [1] => 4 
      [2] => 55 
     ) 

    [3] => Array 
     (
      [0] => 7 
      [1] => 44 
      [2] => 9 
     ) 

) 
*/ 
+0

使用http: //www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list可能會更清楚 –

+0

@CarlosCampderrós,儘管不是所有的參數都是數組。還有一種考慮,即OP給出的示例輸入是一個數組數組。 – primo

1

嘗試這種

function sample($len, $array_list) { 
     $out = array(); 
     //print_r($array_list); 

     $num_arrs = count($array_list); 


     for($n = 0; $n < $len; $n++) { 
     $out[$n] = array(); 
     for($i = 1; $i <= $num_arrs; $i++) { 
      // $array_list['a1'.$i]; 

      $cur = current($array_list['a'.$i]); 
      if(empty($cur)) { 
      reset($array_list['a'.$i]); 
      } 
      $out[$n][] = current($array_list['a'.$i]); 
      next($array_list['a'.$i]); 
     } 
     } 

     return $out; 
    } 

    // example 
    print_r(sample(4, $data)); 
+0

非常感謝。這就是我要的。 –

+0

@tanducar如果這個答案是有用的爲你投票與我 –

3

一個有趣的方式來解決,這是通過使用MultipleItator()

$iterator = new MultipleIterator; 

array_walk($data, function(array $item) use ($iterator) { 
    // attach infinite iterators for each element 
    $iterator->attachIterator(new InfiniteIterator(new ArrayIterator($item))); 
}); 

它使用InfiniteIterator當它到達端倒帶每個陣列。這也意味着迭代器作爲一個整體是無限的;使用這個foreach會去,直到你殺的腳本,所以你必須使用一個for循環:

$iterator->rewind() 
for ($i = 0; $i < 4; ++$i) { 
    print_r($iterator->current()); 
    $iterator->next() 
} 

順便說一句,你不能使用LimitIterator這裏選擇的前四個項目,因爲它會拋出,如果通知你做到了。