2015-06-24 73 views
0

我有以下多维数组称为$existing_combinations比较阵列,直到我有一个独特的阵列

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

    [1] => Array 
     (
      [1] => 1 
      [2] => 21 
      [3] => 9 
     ) 

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

) 

然后我生成具有相同的一组值的组合的新阵列($new_combination)。例如:

Array 
(
    [1] => 6 
    [2] => 21 
    [3] => 9 
) 

然后我测试是否存在于$existing_combinations$new_combination与希望,我将在$new_combination与一个独特的组合结束下列操作:

foreach($existing_combinations as $key => $combination){ 
    while($new_combination == $combination){ 
     $new_combination = generateNewCombination(); 
    } 
} 

的问题是,如果$new_combination匹配的数组那不是在索引0,那么当我产生一个新的组合时,我有可能匹配$combination已经被测试过(并且不会再被测试)。

对不起,如果这是一个简单的,但我很难想出如何确保$new_combination将永远最终独特。

任何想法?

感谢

回答

2

在这种情况下,您可以使用in_array,因为php会将数组作为值进行比较。因此,该代码可以是:

while(in_array($new_combination = generateNewCombination(), $existing_combinations)); 

print_r($new_combination); 
+0

这就像它生成和检查一个新镜头中的一个新的唯一数组一样紧凑。如果我们生成两位数的三元组,并且可能将新的组合添加到现有数组中,那么在1000000次迭代耗尽所有独特组合后,“while”将导致无限循环。在实践中可能永远不会成为问题,但我不知道这里的用例是什么。 –

+0

您编写的代码仅显示测试新值的条件,但不显示make的算法。别的地方在哪里? – splash58

+0

我只写过关于验证新组合是否是唯一的。 –

0

合并所有第二级阵列和运行array_unique()摆脱重复值。

+0

你能告诉我一个如何做这个事情的例子吗? – Maxxi

+0

他在问组合,即。三胞胎。做你的建议不会帮助创建可能具有旧套件价值的新的独特三元组。 –

1

我意识到in_array也可以看到,如果一个数组的数组中存在以前写的下方。所以,你可以简单地这样做:

if (!in_array($new_combination, $existing_combinations)) { 
    // It's unique. 
} 

在下面的过时位,请参阅使用sort,如果相同数字的不同的顺序不考虑你的目的独特的音符。


[娱乐]

未必是世上最优雅的方式,但我只想这样做是为了保持它的简单:

$combo_hashes = []; 

// Implode the existing combos into strings. 
foreach($existing as $vals) { 
    $combo_hashes[] = implode(':', $vals); 
} 

然后,你需要检查你的新组合是:

// Check if the "hash"-string already exists. 

if (!in_array(implode(':', $new_combo), $combo_hashes)) { 
    // ... and we're unique. 
} 

这个假定你认为[1,3,2]不同于[2,1,3]。如果它们是相同的(我不知道你的用例是什么),那么在生成检查字符串之前应该使用sort($vals);

+0

我甚至会说 - 已阅读和理解:) – splash58

+0

起初我怀疑但没有打扰,然后我读了,我明白了,然后我继续测试确定,然后我意识到。 :D'$ a1 = []; $ a1 [] = [1,2,3]; $ a2 = [1,3,2]; if(in_array($ a2,$ a1)){ \t echo'not unique'; } else { \t echo'is unique'; }' –

+0

谢谢你的回答 – Maxxi