比较数组直到我有一个唯一的数组

Comparing arrays until I have a unique array

我有以下名为 $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
)

然后我使用以下代码测试 $new_combination 是否存在于 $existing_combinations 中,希望我能以 $new_combination 中的唯一组合结束:

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

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

很抱歉,如果这是一个简单的问题,但我正在努力思考如何确保 $new_combination 最终始终是独一无二的。

有什么想法吗?

谢谢

合并所有二级数组,运行array_unique()去除重复值

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

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

print_r($new_combination);

我写了下面的才意识到 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);