2014-03-04 25 views
1

我正在研究一個PHP腳本,其中有兩個ID的數組。我需要生成每個可能的配置,可以通過配對兩個陣列中的ID來創建。每個集合都需要包含每個ID的配對。從兩個數組中獲取每組可能的對

我目前使用三個嵌套循環 for,只要我只有每個數組中的三個項目,這似乎產生期望的結果

Array 
(
    [0] => Array 
     (
      [1] => A 
      [2] => C 
      [3] => B 
     ) 

    [1] => Array 
     (
      [1] => A 
      [2] => B 
      [3] => C 
     ) 

    [2] => Array 
     (
      [1] => B 
      [2] => A 
      [3] => C 
     ) 

    [3] => Array 
     (
      [1] => B 
      [2] => C 
      [3] => A 
     ) 

    [4] => Array 
     (
      [1] => C 
      [2] => B 
      [3] => A 
     ) 

    [5] => Array 
     (
      [1] => C 
      [2] => A 
      [3] => B 
     ) 

) 

但是,如果我去到4每個數組中的項目,我可以告訴一些組合缺失。我也得到了一些重複的集合,在這種情況下我可以忍受,但仍然不理想。我懷疑這與我的for循環只涉及3個深度有關,並且我實際上應該在這裏使用遞歸,但遞歸很少出現在我所做的工作類型中,並且我一直無法確定如何有效地實現它爲這種特殊情況返回所需的結果。

這裏是我當前的代碼:

$first = array(1, 2, 3, 4,); 
$second = array('A', 'B', 'C', 'D',); 

$len = count($second); 

for ($i = 0; $i < $len; ++$i) { 
    // Loop through positions 
    for ($pos = 1; $pos < ($len - 1); ++$pos) { 
     // Rotate loop 
     $second_fixed = array_slice($second, 0, $pos); 
     $second_rotate = array_slice($second, $pos); 
     $second_rotate_len = count($second_rotate); 

     for ($k = 0; $k < $second_rotate_len; ++$k) { 
      $second_rotate[] = array_shift($second_rotate); 
      $second = array_merge($second_fixed, $second_rotate); 

      $set = array_combine($first, $second); 
      $alternates[] = $set; 
     } 
    } 

    $second[] = array_shift($second); 
} 

print_r($alternates); 

回答

0

盡我所能爲現在要做的。如果數組長度不一樣,將需要調整。

$first = array(1, 2, 3, 4,); 
$second = array('A', 'B', 'C', 'D',); 

foreach($first as $f) { 
    $result[] = array_combine($first, $second); 
    $s = array_shift($second); 
    $second[] = $s; 
} 
print_r($result); 
+0

這也是我的第一個想法,但簡單的旋轉只會產生每一個配對 - 不是每一組配對。例如,它生成1B 2C 3D 4A,但不能生成1B 2D 3C 4A。 – cfc

0

查找的算法(或僞代碼),其產生所有列表的排列,然後適應這一點。這基本上就是你在這裏做的。